diff --git a/src/main/java/it/unibz/inf/isochrone/db/Database.java b/src/main/java/it/unibz/inf/isochrone/db/Database.java
index 5319c3018fe9a5dac693e26e7b33ca1fdc63be9b..363088bb9500999bb7b976c5717d3da451320015 100644
--- a/src/main/java/it/unibz/inf/isochrone/db/Database.java
+++ b/src/main/java/it/unibz/inf/isochrone/db/Database.java
@@ -81,18 +81,18 @@ public class Database {
 
 		queryLatestDepartureTimeHomo = "SELECT TIME_D, TIME_A, ROUTE_ID FROM ("
 				+ " SELECT TIME_D,TIME_A,ROUTE_ID FROM "
-				+ config.getScheduleTable()
+				+ config.getTableSchedule()
 				+ " WHERE SOURCE = ? AND  TARGET = ? AND ROUTE_ID IN (%S) AND TIME_A>=? AND TIME_A<=? AND SERVICE_ID IN (%S)) C WHERE TIME_D >= ?";
 
 		queryEarliestArrivalTimeHomo = "SELECT TIME_D, TIME_A, ROUTE_ID FROM ("
 				+ " SELECT TIME_D, TIME_A, ROUTE_ID FROM "
-				+ config.getScheduleTable()
+				+ config.getTableSchedule()
 				+ " WHERE SOURCE = ? AND TARGET = ? AND ROUTE_ID IN (%S) AND TIME_D>=? AND TIME_D<=?"
 				+ " AND SERVICE_ID IN (%S)) C WHERE TIME_A <= ?";
 
-		queryGetAllEdges = "SELECT ID, SOURCE, TARGET, LENGTH, EDGE_MODE, ROUTE_ID FROM " + config.getEdgeTable();
+		queryGetAllEdges = "SELECT ID, SOURCE, TARGET, LENGTH, EDGE_MODE, ROUTE_ID FROM " + config.getTableEdges();
 
-		queryGetContinuousEdges = "SELECT ID, SOURCE, TARGET, LENGTH, EDGE_MODE, ROUTE_ID FROM " + config.getEdgeTable() + " WHERE EDGE_MODE=" + NW_MODE_CONTINUOUS;
+		queryGetContinuousEdges = "SELECT ID, SOURCE, TARGET, LENGTH, EDGE_MODE, ROUTE_ID FROM " + config.getTableEdges() + " WHERE EDGE_MODE=" + NW_MODE_CONTINUOUS;
 
 		queryGetDateCodes = "SELECT DISTINCT SERVICE_ID "
 				+ " FROM "
@@ -101,56 +101,56 @@ public class Database {
 				+ " || FRIDAY::int::bit || SATURDAY::int::bit || SUNDAY::int::bit) & ?::bit(7))::int) > 0"
 				+ " AND START_DATE <= ? AND END_DATE >= ? "
 				+ " ORDER BY SERVICE_ID";
-		queryGetCoordinatesFromNode = "SELECT ID,ST_X(GEOMETRY) X, ST_Y(GEOMETRY) Y FROM " + config.getVertexTable() + " WHERE ID=?";
+		queryGetCoordinatesFromNode = "SELECT ID,ST_X(GEOMETRY) X, ST_Y(GEOMETRY) Y FROM " + config.getTableVertex() + " WHERE ID=?";
 
 		queryGetRange = "select D0.DENSITY s0, D0.E_DISTANCE ed0, D1.DENSITY s1, D1.E_DISTANCE ed1 from "
 				+ "(SELECT ID,DENSITY,E_DISTANCE FROM "
-				+ config.getProperty("tbl.vertex.density")
+				+ config.getTableVertexDensity()
 				+ " WHERE ID=? AND DENSITY<? ORDER BY DENSITY DESC LIMIT 1) D0 FULL JOIN "
 				+ "(SELECT ID,DENSITY,E_DISTANCE FROM "
-				+ config.getProperty("tbl.vertex.density")
+				+ config.getTableVertexDensity()
 				+ " WHERE ID=? AND DENSITY>=? ORDER BY DENSITY ASC LIMIT 1) D1 ON D0.ID=D1.ID";
 
 		queryLoadLinksFromIER = "SELECT L.ID, L.SOURCE,L.SOURCE_MODE,L.TARGET,L.TARGET_MODE,L.LENGTH,L.EDGE_MODE,L.ROUTE_ID,"
 				+ (isIncoming ? "L.SOURCE_OUTDEGREE" : "L.TARGET_INDEGREE")
-				+ " DEGREE FROM " + config.getEdgeTable() + " L, "
-				+ config.getVertexTable() + " N "
+				+ " DEGREE FROM " + config.getTableEdges() + " L, "
+				+ config.getTableVertex() + " N "
 				+ " WHERE L."
 				+ (isIncoming ? "TARGET" : "SOURCE")
 				+ "=N.ID" + " AND ST_DWITHIN(ST_PointFromText(?,?),N.GEOMETRY,?)='TRUE'";
 
 		queryGetLink = "SELECT SOURCE, TARGET, "
 				+ (isIncoming ? "SOURCE_OUTDEGREE" : "TARGET_INDEGREE")
-				+ " NODE_DEGREE, LENGTH FROM " + config.getEdgeTable()
+				+ " NODE_DEGREE, LENGTH FROM " + config.getTableEdges()
 				+ " WHERE ID = ? AND EDGE_MODE=" + NW_MODE_CONTINUOUS;
 
 		queryGetContinuousLink = "SELECT SOURCE, TARGET, "
 				+ (isIncoming ? "SOURCE_C_OUTDEGREE" : "TARGET_C_INDEGREE")
-				+ " NODE_DEGREE, LENGTH FROM " + config.getEdgeTable()
+				+ " NODE_DEGREE, LENGTH FROM " + config.getTableEdges()
 				+ " WHERE ID = ? AND EDGE_MODE=" + NW_MODE_CONTINUOUS;
 
 		queryGetContinuousNode = "SELECT "
 				+ (isIncoming ? "SOURCE_C_OUTDEGREE" : "TARGET_C_INDEGREE")
-				+ " NODE_DEGREE FROM " + config.getEdgeTable()
+				+ " NODE_DEGREE FROM " + config.getTableEdges()
 				+ (isIncoming ? "SOURCE=?" : "TARGET=?")
 				+ "AND EDGE_MODE=" + NW_MODE_CONTINUOUS;
 
 		queryGetMrneXNode = "SELECT "
 				+ (isIncoming ? "OUTDEGREE" : "INDEGREE")
-				+ " NODE_DEGREE, ST_X(GEOMETRY) X, ST_Y(GEOMETRY) Y FROM " + config.getVertexTable() + " WHERE ID=?";
+				+ " NODE_DEGREE, ST_X(GEOMETRY) X, ST_Y(GEOMETRY) Y FROM " + config.getTableVertex() + " WHERE ID=?";
 
 		queryGetLinksInRange = "SELECT L.ID,L.SOURCE,L.SOURCE_MODE,L.TARGET,L.TARGET_MODE,L.LENGTH,L.EDGE_MODE,L.ROUTE_ID,"
-				+ (isIncoming ? "L.SOURCE_OUTDEGREE" : "L.TARGET_INDEGREE") + " DEGREE FROM " + config.getEdgeTable()
-				+ " L, " + config.getVertexTable() + " N WHERE L." + (isIncoming ? "TARGET" : "SOURCE")
+				+ (isIncoming ? "L.SOURCE_OUTDEGREE" : "L.TARGET_INDEGREE") + " DEGREE FROM " + config.getTableEdges()
+				+ " L, " + config.getTableVertex() + " N WHERE L." + (isIncoming ? "TARGET" : "SOURCE")
 				+ "=N.ID AND st_intersects(N.GEOMETRY,%S)";
 
 		if (isIncoming) {
-			queryGetAdjLinks = "SELECT ID,SOURCE NODE_ID,SOURCE_OUTDEGREE NODE_DEGREE,LENGTH,EDGE_MODE,ROUTE_ID FROM " + config.getEdgeTable() + " WHERE TARGET=?";
-			queryGetAdjContinuousLinks = "SELECT ID,SOURCE NODE_ID,SOURCE_C_OUTDEGREE NODE_DEGREE,LENGTH,EDGE_MODE,ROUTE_ID FROM " + config.getEdgeTable()
+			queryGetAdjLinks = "SELECT ID,SOURCE NODE_ID,SOURCE_OUTDEGREE NODE_DEGREE,LENGTH,EDGE_MODE,ROUTE_ID FROM " + config.getTableEdges() + " WHERE TARGET=?";
+			queryGetAdjContinuousLinks = "SELECT ID,SOURCE NODE_ID,SOURCE_C_OUTDEGREE NODE_DEGREE,LENGTH,EDGE_MODE,ROUTE_ID FROM " + config.getTableEdges()
 					+ " WHERE TARGET=? AND EDGE_MODE=" + NW_MODE_CONTINUOUS;
 		} else {
-			queryGetAdjLinks = "SELECT ID,TARGET NODE_ID,TARGET_INDEGREE NODE_DEGREE, LENGTH,EDGE_MODE,ROUTE_ID FROM " + config.getEdgeTable() + " WHERE SOURCE=?";
-			queryGetAdjContinuousLinks = "SELECT ID,TARGET NODE_ID, TARGET_C_INDEGREE NODE_DEGREE,LENGTH FROM " + config.getEdgeTable() + " WHERE TARGET=? AND EDGE_MODE=";
+			queryGetAdjLinks = "SELECT ID,TARGET NODE_ID,TARGET_INDEGREE NODE_DEGREE, LENGTH,EDGE_MODE,ROUTE_ID FROM " + config.getTableEdges() + " WHERE SOURCE=?";
+			queryGetAdjContinuousLinks = "SELECT ID,TARGET NODE_ID, TARGET_C_INDEGREE NODE_DEGREE,LENGTH FROM " + config.getTableEdges() + " WHERE TARGET=? AND EDGE_MODE=";
 		}
 	}
 
diff --git a/src/main/java/it/unibz/inf/isochrone/util/Config.java b/src/main/java/it/unibz/inf/isochrone/util/Config.java
index c1aaacc4ebfc476ef18e85fd185bdce44d4c6122..bd6922a408be996a85b37a794744c450574f1270 100644
--- a/src/main/java/it/unibz/inf/isochrone/util/Config.java
+++ b/src/main/java/it/unibz/inf/isochrone/util/Config.java
@@ -134,38 +134,28 @@ public class Config {
 		return getProperty("org.postgresql.username");
 	}
 
-	public String getEdgeTable() {
-		return getProperty("tbl.links");
+	public int getServerSRID() {
+		return Integer.parseInt(getProperty("sql.spatial.srid"));
 	}
 
-	/**
-	 * Returns the value of the entry specified by the passed <code>key</code>.
-	 *
-	 * @param key the key that identifies the entry
-	 * @return the value of the entry
-	 */
-	public String getProperty(final String key) {
-		if (internalProperties.getProperty(key) == null) {
-			return null;
-		}
-
-		return internalProperties.getProperty(key).trim();
+	public String getTableEdges() {
+		return getProperty("tbl.links");
 	}
 
-	public String getRouteTable() {
+	public String getTableRoutes() {
 		return getProperty("tbl.routes");
 	}
 
-	public String getScheduleTable() {
+	public String getTableSchedule() {
 		return getProperty("tbl.times");
 	}
 
-	public int getServerSRID() {
-		return Integer.parseInt(getProperty("sql.spatial.srid"));
+	public String getTableVertex() {
+		return getProperty("tbl.nodes");
 	}
 
-	public String getVertexTable() {
-		return getProperty("tbl.nodes");
+	public String getTableVertexDensity() {
+		return getProperty("tbl.vertex.density");
 	}
 
 	// Protected methods
@@ -215,6 +205,20 @@ public class Config {
 		internalProperties.putAll(System.getProperties());
 	}
 
+	/**
+	 * Returns the value of the entry specified by the passed <code>key</code>.
+	 *
+	 * @param key the key that identifies the entry
+	 * @return the value of the entry
+	 */
+	protected String getProperty(final String key) {
+		if (internalProperties.getProperty(key) == null) {
+			return null;
+		}
+
+		return internalProperties.getProperty(key).trim();
+	}
+
 	// Private methods
 
 	private ConnectionFactory initConnectionFactory() {
@@ -246,5 +250,4 @@ public class Config {
 
 		return f;
 	}
-
 }
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 dc30938a35829c83b15af246c41c0785b18b7618..543d519c24ea61d9535a99546e133e18262bbfb3 100644
--- a/src/main/java/it/unibz/inf/isoga/db/DbUtility.java
+++ b/src/main/java/it/unibz/inf/isoga/db/DbUtility.java
@@ -328,7 +328,7 @@ public final class DbUtility {
 			statement = connection.prepareStatement(query);
 			// CHECKSTYLE:OFF MagicNumber
 			statement.setString(1, config.getDestinationVertexAnnotatedTableEntry().getTableName());
-			statement.setString(2, config.getRouteTable());
+			statement.setString(2, config.getTableRoutes());
 			statement.setInt(3, vertexId);
 			// CHECKSTYLE:ON MagicNumber
 
diff --git a/src/main/java/it/unibz/inf/isoga/db/IsogaDatabase.java b/src/main/java/it/unibz/inf/isoga/db/IsogaDatabase.java
index 6bba13cc5a34d453a1ed9365512f475cc5dce0f4..e300c73e0d39a7f0771a50807004d35ca71c6548 100644
--- a/src/main/java/it/unibz/inf/isoga/db/IsogaDatabase.java
+++ b/src/main/java/it/unibz/inf/isoga/db/IsogaDatabase.java
@@ -60,21 +60,21 @@ public class IsogaDatabase extends Database {
 				+ " WHERE E.\"SOURCE\" = V.\"ID\" ORDER BY \"OFFSET\" " + (isIncoming ? "DESC" : "ASC");
 
 		queryStoreLinks = "INSERT INTO " + cfg.getDestinationEdgeTableEntry().getTableName()
-				+ " (\"ID\",\"SOURCE\",\"TARGET\",\"OFFSET\",\"LENGTH\",\"GEOMETRY\") (SELECT ID,SOURCE,TARGET,?,LENGTH," + " GEOMETRY FROM " + cfg.getEdgeTable() + " WHERE ID =?)";
+				+ " (\"ID\",\"SOURCE\",\"TARGET\",\"OFFSET\",\"LENGTH\",\"GEOMETRY\") (SELECT ID,SOURCE,TARGET,?,LENGTH," + " GEOMETRY FROM " + cfg.getTableEdges() + " WHERE ID =?)";
 
 		queryStorePartialLinks = "INSERT INTO " + cfg.getDestinationEdgeTableEntry().getTableName()
 				+ " (\"ID\",\"SOURCE\",\"TARGET\",\"OFFSET\",\"LENGTH\",\"GEOMETRY\") (SELECT ID,SOURCE,TARGET,?,LENGTH,"
-				+ " ST_LINE_SUBSTRING(GEOMETRY,?,?) FROM " + cfg.getEdgeTable() + " WHERE ID = ?)";
+				+ " ST_LINE_SUBSTRING(GEOMETRY,?,?) FROM " + cfg.getTableEdges() + " WHERE ID = ?)";
 
 		queryInsertVertex = "INSERT INTO " + cfg.getDestinationVertexTableEntry().getTableName()
-				+ " (\"ID\",\"DISTANCE\",\"ROUTE_ID\",\"STATE\",\"GEOMETRY\") (SELECT ?,?,?,?,GEOMETRY FROM " + cfg.getVertexTable()
+				+ " (\"ID\",\"DISTANCE\",\"ROUTE_ID\",\"STATE\",\"GEOMETRY\") (SELECT ?,?,?,?,GEOMETRY FROM " + cfg.getTableVertex()
 				+ " WHERE ID=?)";
 
 		queryInsertVertexAnnotation = "INSERT INTO " + cfg.getDestinationVertexAnnotatedTableEntry().getTableName()
 				+ " (\"ID\", \"ROUTE_ID\",\"TIME_A\",\"TIME_D\") VALUES (?,?,?,?)";
 
 		queryUpdateVertices = "UPDATE " + cfg.getDestinationVertexTableEntry().getTableName()
-				+ " SET \"T_TYPE\"=R.ROUTE_TYPE FROM " + cfg.getRouteTable() + " R WHERE R.ROUTE_ID = "
+				+ " SET \"T_TYPE\"=R.ROUTE_TYPE FROM " + cfg.getTableRoutes() + " R WHERE R.ROUTE_ID = "
 				+ cfg.getDestinationVertexTableEntry().getTableName() + ".\"ROUTE_ID\" " + "AND "
 				+ cfg.getDestinationVertexTableEntry().getTableName() + ".\"ROUTE_ID\">=0";
 	}
@@ -260,7 +260,7 @@ public class IsogaDatabase extends Database {
 		int reachedInhabitants = 0;
 		final StringBuilder b = new StringBuilder();
 		b.append("SELECT SUM(I.INHABITANTS) FROM (SELECT DISTINCT B.ID, B.INHABITANTS FROM ");
-		b.append(config.getProperty("tbl.building")).append(" B, ");
+		b.append(((ConfigWeb) config).getTableBuilding()).append(" B, ");
 		b.append(((ConfigWeb) config).getDestinationAreaBufferTableEntry().getTableName()).append(" A ");
 		b.append("WHERE ST_Within(B.GEOMETRY, A.GEOMETRY)='TRUE') I");
 
@@ -283,7 +283,7 @@ public class IsogaDatabase extends Database {
 	}
 
 	public int totalInhabitants() {
-		final String query = "SELECT SUM(INHABITANTS) FROM " + config.getProperty("tbl.building");
+		final String query = "SELECT SUM(INHABITANTS) FROM " + ((ConfigWeb) config).getTableBuilding();
 		int totalInhabitants = 0;
 
 		PreparedStatement statement = null;
@@ -363,7 +363,7 @@ public class IsogaDatabase extends Database {
 		final StringBuilder sb = new StringBuilder();
 		sb.append("SELECT L.ID, ST_Line_Locate_Point(L.EDGE_GEO,L.POINT_GEO)*L.LENGTH AS OFFSET ");
 		sb.append("FROM (SELECT E.ID, E.GEOMETRY EDGE_GEO, E.LENGTH, P.GEOMETRY POINT_GEO FROM ");
-		sb.append(config.getEdgeTable()).append(" E, ");
+		sb.append(config.getTableEdges()).append(" E, ");
 		sb.append(" (SELECT ");
 		if (config.getClientSRID() == config.getServerSRID()) {
 			sb.append("ST_PointFromText(?,?) ");
@@ -382,7 +382,7 @@ public class IsogaDatabase extends Database {
 			statement.setInt(2, config.getClientSRID());
 
 			// CHECKSTYLE:OFF MagicNumber
-			final int tolerance = Integer.parseInt(config.getProperty("par.distance_tolerance"));
+			final int tolerance = ((ConfigWeb) config).getDistanceTolerance();
 			if (config.getClientSRID() != config.getServerSRID()) {
 				statement.setInt(3, config.getServerSRID());
 				statement.setInt(4, tolerance);
diff --git a/src/main/java/it/unibz/inf/isoga/geometry/BBox.java b/src/main/java/it/unibz/inf/isoga/geometry/BBox.java
index 3f17cebf762a0da402ed98a4b011b86ed1379ff6..258265e8ac4227309a600eb2b57823498c30a4a0 100644
--- a/src/main/java/it/unibz/inf/isoga/geometry/BBox.java
+++ b/src/main/java/it/unibz/inf/isoga/geometry/BBox.java
@@ -2,62 +2,75 @@ package it.unibz.inf.isoga.geometry;
 
 import it.unibz.inf.isochrone.util.Point;
 
-import org.json.JSONArray;
-import org.json.JSONException;
-
 /**
  * A bounding box in which the isochrone is to be displayed.
  */
 public class BBox implements Comparable<BBox> {
-	private final long minX, minY, maxX, maxY;
+	private final double minX;
+	private final double minY;
+	private final double maxX;
+	private final double maxY;
+
+	// Constructors
 
 	public BBox(final double minX, final double minY, final double maxX, final double maxY) {
-		this.minX = Math.round(minX);
-		this.minY = Math.round(minY);
-		this.maxX = Math.round(maxX);
-		this.maxY = Math.round(maxY);
+		this.minX = minX;
+		this.minY = minY;
+		this.maxX = maxX;
+		this.maxY = maxY;
 	}
 
 	public BBox(final Point lowerCorner, final Point upperCorner) {
-		minX = (lowerCorner == null) ? 0 : Math.round(lowerCorner.getX());
-		minY = (lowerCorner == null) ? 0 : Math.round(lowerCorner.getY());
-		maxX = (upperCorner == null) ? 0 : Math.round(upperCorner.getX());
-		maxY = (upperCorner == null) ? 0 : Math.round(upperCorner.getY());
+		minX = (lowerCorner == null) ? 0 : lowerCorner.getX();
+		minY = (lowerCorner == null) ? 0 : lowerCorner.getY();
+		maxX = (upperCorner == null) ? 0 : upperCorner.getX();
+		maxY = (upperCorner == null) ? 0 : upperCorner.getY();
 	}
 
-	public JSONArray toJSON() throws JSONException {
-		return new JSONArray(new long[] { minX, minY, maxX, maxY });
+	// Getter
+
+	public Point getLowerCorner() {
+		return new Point(minX, minY);
 	}
 
 	public long getMinX() {
-		return minX;
+		return Math.round(minX);
 	}
 
 	public long getMinY() {
-		return minY;
+		return Math.round(minY);
 	}
 
 	public long getMaxX() {
-		return maxX;
+		return Math.round(maxX);
 	}
 
 	public long getMaxY() {
-		return maxY;
+		return Math.round(maxY);
 	}
 
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
+	public Point getUpperCorner() {
+		return new Point(maxX, maxY);
+	}
 
-		// CHECKSTYLE:OFF MagicNumber
-		result = prime * result + (int) (maxX ^ (maxX >>> 32));
-		result = prime * result + (int) (maxY ^ (maxY >>> 32));
-		result = prime * result + (int) (minX ^ (minX >>> 32));
-		result = prime * result + (int) (minY ^ (minY >>> 32));
-		// CHECKSTYLE:ON MagicNumber
+	// Public methods
 
-		return result;
+	@Override
+	public int compareTo(final BBox other) {
+		if (getMinX() < other.getMinX()) {
+			return -1;
+		}
+		if (getMinX() > other.getMinX()) {
+			return 1;
+		}
+		if (getMinY() < other.getMinY()) {
+			return -1;
+		}
+		if (getMinY() > other.getMinY()) {
+			return 1;
+		}
+
+		return 0;
 	}
 
 	@Override
@@ -82,21 +95,22 @@ public class BBox implements Comparable<BBox> {
 	}
 
 	@Override
-	public int compareTo(final BBox other) {
-		if (getMinX() < other.getMinX()) {
-			return -1;
-		}
-		if (getMinX() > other.getMinX()) {
-			return 1;
-		}
-		if (getMinY() < other.getMinY()) {
-			return -1;
-		}
-		if (getMinY() > other.getMinY()) {
-			return 1;
-		}
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		long temp;
 
-		return 0;
-	}
+		// CHECKSTYLE:OFF MagicNumber
+		temp = Double.doubleToLongBits(maxX);
+		result = prime * result + (int) (temp ^ (temp >>> 32));
+		temp = Double.doubleToLongBits(maxY);
+		result = prime * result + (int) (temp ^ (temp >>> 32));
+		temp = Double.doubleToLongBits(minX);
+		result = prime * result + (int) (temp ^ (temp >>> 32));
+		temp = Double.doubleToLongBits(minY);
+		result = prime * result + (int) (temp ^ (temp >>> 32));
+		// CHECKSTYLE:ON MagicNumber
 
+		return result;
+	}
 }
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 921ed91c689341b6d1a7fa81230d2a4d5d94ebbd..0d9a7b7be698c7d9d2faa4962b6bd5cf25d57704 100644
--- a/src/main/java/it/unibz/inf/isoga/service/AbstractService.java
+++ b/src/main/java/it/unibz/inf/isoga/service/AbstractService.java
@@ -45,8 +45,8 @@ public abstract class AbstractService<T extends IRequest, U extends IResponse> i
 	protected void registerLayers(final Connection connection, final ConfigDataset dSetConfig) {
 		final ConfigWeb globalConfig = configContainer.getGlobalConfig();
 		final GeoServerRESTPublisher publisher = globalConfig.getGeoServerPublisher();
-		final String ds = globalConfig.getProperty("rendering.server.rest.datastore");
-		final String ws = globalConfig.getProperty("rendering.server.rest.workspace");
+		final String ws = globalConfig.getRenderServerWorkspace();
+		final String ds = globalConfig.getRenderServerDatastore();
 		final BBox serverExtend = dSetConfig.getServerExtent();
 		final int serverSrid = dSetConfig.getServerSRID();
 		final String srs = "EPSG:" + serverSrid;
diff --git a/src/main/java/it/unibz/inf/isoga/service/ServiceConfiguration.java b/src/main/java/it/unibz/inf/isoga/service/ServiceConfiguration.java
index 9577760b8b8983660c62928b42426712a4c23113..e0056cf28eae0f7bc561a6fa354535cd2e88f2af 100644
--- a/src/main/java/it/unibz/inf/isoga/service/ServiceConfiguration.java
+++ b/src/main/java/it/unibz/inf/isoga/service/ServiceConfiguration.java
@@ -9,6 +9,7 @@ import it.unibz.inf.isoga.util.ConfigDataset;
 import it.unibz.inf.isoga.util.ConfigWeb;
 
 import java.sql.Connection;
+import java.util.Collection;
 
 import javax.websocket.Session;
 
@@ -33,20 +34,16 @@ public class ServiceConfiguration extends AbstractService<RequestConfiguration,
 		configContainer.setClientConfig(clientId, new ConfigWeb(globalConfig));
 
 		final ResponseConfiguration resp = new ResponseConfiguration(globalConfig);
-		for (final ConfigDataset templateConfig : configContainer.getDatasetTemplates()) {
-			final ConfigDataset clientConfig = (ConfigDataset) templateConfig.clone();
-			clientConfig.appendTableSuffix(clientId);
-			configContainer.setClientDSetConfig(clientId, clientConfig);
-
+		final Collection<ConfigDataset> clientConfigs = configContainer.initClient(clientId);
+		for (final ConfigDataset clientConfig : clientConfigs) {
 			resp.addDSetConfig(clientConfig);
 		}
 
-		preregisterDatasets(clientId, globalConfig);
-
+		preregisterClients(clientId, globalConfig);
 		return resp;
 	}
 
-	private void preregisterDatasets(final String clientId, final Config config) {
+	private void preregisterClients(final String clientId, final Config config) {
 		final Connection connection = config.getConnection();
 
 		for (Dataset dataset : PREREGISTERING_DATASETS) {
diff --git a/src/main/java/it/unibz/inf/isoga/service/dto/ResponseConfiguration.java b/src/main/java/it/unibz/inf/isoga/service/dto/ResponseConfiguration.java
index 6c07c9fdb5c0fa95ad28e45c2b9dc9979972867b..9fb93534b64b5bfcb9ef1c24d8cd845c30735434 100644
--- a/src/main/java/it/unibz/inf/isoga/service/dto/ResponseConfiguration.java
+++ b/src/main/java/it/unibz/inf/isoga/service/dto/ResponseConfiguration.java
@@ -1,7 +1,7 @@
 package it.unibz.inf.isoga.service.dto;
 
-import it.unibz.inf.isochrone.util.Config;
 import it.unibz.inf.isoga.util.ConfigDataset;
+import it.unibz.inf.isoga.util.ConfigWeb;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -13,11 +13,11 @@ public class ResponseConfiguration implements IResponse {
 	private final String version;
 	private final Collection<ConfigDataset> defaultDatasets;
 
-	public ResponseConfiguration(final Config config) {
+	public ResponseConfiguration(final ConfigWeb config) {
 		defaultDatasets = new ArrayList<ConfigDataset>();
 
-		mapserverUrl = config.getProperty("rendering.server.url");
-		version = config.getProperty("version");
+		mapserverUrl = config.getRenderServerURL();
+		version = config.getVersion();
 	}
 
 	public void addDSetConfig(final ConfigDataset dsetConfig) {
diff --git a/src/main/java/it/unibz/inf/isoga/util/ConfigDataset.java b/src/main/java/it/unibz/inf/isoga/util/ConfigDataset.java
index 0a4313e6aa3abf4d02058f8bdf6d478d98d6d3fe..d5fd889d7408320e15e289550cd5e2a7d20e326f 100644
--- a/src/main/java/it/unibz/inf/isoga/util/ConfigDataset.java
+++ b/src/main/java/it/unibz/inf/isoga/util/ConfigDataset.java
@@ -245,16 +245,11 @@ public final class ConfigDataset implements Cloneable {
 
 	// Public methods
 
-	public void appendTableSuffix(final String suffix) {
-		edgeLayer = appendSuffix(edgeLayer, suffix);
-		vertexLayer = appendSuffix(vertexLayer, suffix);
-		areaBufferLayer = appendSuffix(areaBufferLayer, suffix);
-		vertexAnnotatedTableName = appendSuffix(vertexAnnotatedTableName, suffix);
+	public ConfigDataset createFromTemplate(final String clientId) {
+		final ConfigDataset resultConfig = (ConfigDataset) this.clone();
+		resultConfig.appendTableSuffix(clientId);
 
-		edgeTableEntry = new TableEntry(edgeLayer, "sidx_" + edgeLayer, TableType.EDGE);
-		vertexTableEntry = new TableEntry(vertexLayer, "sidx_" + vertexLayer, TableType.VERTEX);
-		vertexAnnotatedTableEntry = new TableEntry(vertexAnnotatedTableName, "sidx_" + vertexAnnotatedTableName, TableType.VERTEX);
-		areaBufferTableEntry = new TableEntry(areaBufferLayer, "sidx_" + areaBufferLayer, TableType.COVERAGE);
+		return resultConfig;
 	}
 
 	@Override
@@ -268,7 +263,21 @@ public final class ConfigDataset implements Cloneable {
 
 	// Private methods
 
-	private String appendSuffix(final String layerName, final String id) {
+	private void appendTableSuffix(final String suffix) {
+		edgeLayer = appendSuffix(edgeLayer, suffix);
+		vertexLayer = appendSuffix(vertexLayer, suffix);
+		areaBufferLayer = appendSuffix(areaBufferLayer, suffix);
+		vertexAnnotatedTableName = appendSuffix(vertexAnnotatedTableName, suffix);
+
+		edgeTableEntry = new TableEntry(edgeLayer, "sidx_" + edgeLayer, TableType.EDGE);
+		vertexTableEntry = new TableEntry(vertexLayer, "sidx_" + vertexLayer, TableType.VERTEX);
+		vertexAnnotatedTableEntry = new TableEntry(vertexAnnotatedTableName, "sidx_" + vertexAnnotatedTableName, TableType.VERTEX);
+		areaBufferTableEntry = new TableEntry(areaBufferLayer, "sidx_" + areaBufferLayer, TableType.COVERAGE);
+	}
+
+	// Private static methods
+
+	private static String appendSuffix(final String layerName, final String id) {
 		String name = layerName + "_" + id;
 		if (name.length() > NAME_MAX_LENGTH) {
 			// CHECKSTYLE:OFF MagicNumber
diff --git a/src/main/java/it/unibz/inf/isoga/util/ConfigWeb.java b/src/main/java/it/unibz/inf/isoga/util/ConfigWeb.java
index 015ed5378b7009911bdb5b10bf152ce78aa0bbb5..a1080fe0aa6ecbb4008d93972cf6b81c7257ba83 100644
--- a/src/main/java/it/unibz/inf/isoga/util/ConfigWeb.java
+++ b/src/main/java/it/unibz/inf/isoga/util/ConfigWeb.java
@@ -8,7 +8,9 @@ import it.unibz.inf.isochrone.util.Config;
 import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isochrone.util.EnumContainer.Direction;
 import it.unibz.inf.isochrone.util.EnumContainer.TableType;
+import it.unibz.inf.isochrone.util.Point;
 import it.unibz.inf.isoga.db.TableEntry;
+import it.unibz.inf.isoga.geometry.BBox;
 
 import java.io.InputStream;
 import java.net.MalformedURLException;
@@ -38,11 +40,6 @@ public class ConfigWeb extends Config {
 		manager = initManager();
 	}
 
-	public ConfigWeb(final Dataset dataset) {
-		super(dataset);
-		manager = initManager();
-	}
-
 	public ConfigWeb(final ConfigDataset datasetConfig, final Direction direction) {
 		super(datasetConfig.getDataset());
 
@@ -60,8 +57,22 @@ public class ConfigWeb extends Config {
 		manager = config.manager;
 	}
 
+	public ConfigWeb(final Dataset dataset) {
+		super(dataset);
+		manager = initManager();
+	}
+
 	// Getter
 
+	public String getClientArrivalTime() {
+		return getProperty("client.tArrival");
+	}
+
+	public Point getClientPOI() {
+		final String[] poiProperty = getProperty("client.poi").split(",");
+		return new Point(Double.valueOf(poiProperty[0]), Double.valueOf(poiProperty[1]));
+	}
+
 	public TableEntry getDestinationAreaBufferTableEntry() {
 		return destinationAreaBufferTableEntry;
 	}
@@ -82,6 +93,10 @@ public class ConfigWeb extends Config {
 		return direction;
 	}
 
+	public int getDistanceTolerance() {
+		return Integer.parseInt(getProperty("par.distance_tolerance"));
+	}
+
 	public GeoServerRESTPublisher getGeoServerPublisher() {
 		return manager.getPublisher();
 	}
@@ -94,6 +109,65 @@ public class ConfigWeb extends Config {
 		return manager.getStoreManager();
 	}
 
+	public String getIndexIsoAreaBuffer() {
+		return getProperty("idx.isoAreaBuffer");
+	}
+
+	public String getIndexIsoLinks() {
+		return getProperty("idx.isoLinks");
+	}
+
+	public String getIndexIsoNodes() {
+		return getProperty("idx.isoNodes");
+	}
+
+	public String getRenderServerDatastore() {
+		return getProperty("rendering.server.rest.datastore");
+	}
+
+	public String getRenderServerURL() {
+		return getProperty("rendering.server.url");
+	}
+
+	public String getRenderServerWorkspace() {
+		return getProperty("rendering.server.rest.workspace");
+	}
+
+	public BBox getServerBBox() {
+		final double lower1 = Double.parseDouble(getProperty("sql.spatial.dim1.lower"));
+		final double lower2 = Double.parseDouble(getProperty("sql.spatial.dim2.lower"));
+		final double upper1 = Double.parseDouble(getProperty("sql.spatial.dim1.upper"));
+		final double upper2 = Double.parseDouble(getProperty("sql.spatial.dim2.upper"));
+
+		final Point lowerCorner = new Point(lower1, lower2);
+		final Point upperCorner = new Point(upper1, upper2);
+		return new BBox(lowerCorner, upperCorner);
+	}
+
+	public String getTableBuilding() {
+		return getProperty("tbl.building");
+	}
+
+	public String getTableIsoAreaBuffer() {
+		return getProperty("tbl.isoAreaBuffer");
+	}
+
+	public String getTableIsoLinks() {
+		return getProperty("tbl.isoLinks");
+	}
+
+	public String getTableIsoNodes() {
+		return getProperty("tbl.isoNodes");
+	}
+
+	public String getTableIsoNodesAnnotations() {
+		return getProperty("tbl.isoNodesAnnotations");
+	}
+
+	public String getVersion() {
+		return getProperty("version");
+	}
+
 	public boolean isIncoming() {
 		return (getDirection() == Direction.INCOMING);
 	}
@@ -104,10 +178,10 @@ public class ConfigWeb extends Config {
 	protected void appendPropertiesFromStream(final InputStream inputStream) {
 		super.appendPropertiesFromStream(inputStream);
 
-		destinationEdgeTableEntry = getTableEntry(getProperty("tbl.isoLinks"), getProperty("idx.isoLinks"), TableType.EDGE);
-		destinationAreaBufferTableEntry = getTableEntry(getProperty("tbl.isoAreaBuffer"), getProperty("idx.isoAreaBuffer"), TableType.COVERAGE);
-		destinationVertexAnnotatedTableEntry = getTableEntry(getProperty("tbl.isoNodesAnnotations"));
-		destinationVertexTableEntry = getTableEntry(getProperty("tbl.isoNodes"), getProperty("idx.isoNodes"), TableType.VERTEX);
+		destinationEdgeTableEntry = getTableEntry(getTableIsoLinks(), getIndexIsoLinks(), TableType.EDGE);
+		destinationAreaBufferTableEntry = getTableEntry(getTableIsoAreaBuffer(), getIndexIsoAreaBuffer(), TableType.COVERAGE);
+		destinationVertexAnnotatedTableEntry = getTableEntry(getTableIsoNodesAnnotations());
+		destinationVertexTableEntry = getTableEntry(getTableIsoNodes(), getIndexIsoNodes(), TableType.VERTEX);
 	}
 
 	// Private methods
diff --git a/src/main/java/it/unibz/inf/isoga/web/ConfigContainer.java b/src/main/java/it/unibz/inf/isoga/web/ConfigContainer.java
index 3bc34c176a2c37f94889ca3d6e4171cf950fc977..daacbb8e1eeac630e70ef82d915c8c07f96e59ef 100644
--- a/src/main/java/it/unibz/inf/isoga/web/ConfigContainer.java
+++ b/src/main/java/it/unibz/inf/isoga/web/ConfigContainer.java
@@ -80,9 +80,7 @@ public final class ConfigContainer {
 		return clientDatasets.get(clientId).values();
 	}
 
-	public Collection<ConfigDataset> getDatasetTemplates() {
-		return datasetTemplates;
-	}
+	// Setter methods
 
 	public void setClientConfig(final String clientId, final ConfigWeb config) {
 		clientConfigMap.put(clientId, config);
@@ -96,6 +94,17 @@ public final class ConfigContainer {
 		clientDatasets.get(clientId).put(datasetConfig.getDataset(), datasetConfig);
 	}
 
+	// Public methods
+
+	public Collection<ConfigDataset> initClient(final String clientId) {
+		final Collection<ConfigDataset> createConfigs = new ArrayList<ConfigDataset>(datasetTemplates.size());
+		for (final ConfigDataset templateConfig : datasetTemplates) {
+			setClientDSetConfig(clientId, templateConfig.createFromTemplate(clientId));
+		}
+
+		return createConfigs;
+	}
+
 	// Private methods
 
 	private void initDatasetTemplates(final Collection<String> dataSets) {
@@ -118,19 +127,11 @@ public final class ConfigContainer {
 			}
 
 			final ConfigWeb config = new ConfigWeb(dataSet);
-			final String areaBufferTable = config.getProperty("tbl.isoAreaBuffer");
-			final String arrivalTime = config.getProperty("client.tArrival");
-			final String[] poiProperty = config.getProperty("client.poi").split(",");
-			final String ws = config.getProperty("rendering.server.rest.workspace");
-			final double lower1 = Double.parseDouble(config.getProperty("sql.spatial.dim1.lower"));
-			final double lower2 = Double.parseDouble(config.getProperty("sql.spatial.dim2.lower"));
-			final double upper1 = Double.parseDouble(config.getProperty("sql.spatial.dim1.upper"));
-			final double upper2 = Double.parseDouble(config.getProperty("sql.spatial.dim2.upper"));
-
-			final Point lowerCorner = new Point(lower1, lower2);
-			final Point upperCorner = new Point(upper1, upper2);
-			final BBox serverBBox = new BBox(lowerCorner, upperCorner);
-
+			final String areaBufferTable = config.getTableIsoAreaBuffer();
+			final String arrivalTime = config.getClientArrivalTime();
+			final Point clientPOI = config.getClientPOI();
+			final String ws = config.getRenderServerWorkspace();
+			final BBox serverBBox = config.getServerBBox();
 			final Calendar targetTime = Calendar.getInstance();
 			try {
 				DateFormat dateFormatter = new SimpleDateFormat(FORMAT_DATE);
@@ -140,8 +141,8 @@ public final class ConfigContainer {
 			}
 
 			final IsogaDatabase db = new IsogaDatabase(config);
-			final BBox clientBBox = new BBox(db.transform(lowerCorner), db.transform(upperCorner));
-			final Point queryPoint = db.transform(new Point(Double.valueOf(poiProperty[0]), Double.valueOf(poiProperty[1])));
+			final BBox clientBBox = new BBox(db.transform(serverBBox.getLowerCorner()), db.transform(serverBBox.getUpperCorner()));
+			final Point queryPoint = db.transform(clientPOI);
 
 			final ConfigDataset dSetConfig = new ConfigDataset.Builder(dataSet)
 				.serverMBR(serverBBox)
diff --git a/src/main/java/it/unibz/inf/isoga/web/GeoserverHelper.java b/src/main/java/it/unibz/inf/isoga/web/GeoserverHelper.java
index 4166c41cfc4d5e03f4dae334438e7defa2bfa332..076bfc0fafdb5854638515cc4a2c5b1c1cdefec9 100644
--- a/src/main/java/it/unibz/inf/isoga/web/GeoserverHelper.java
+++ b/src/main/java/it/unibz/inf/isoga/web/GeoserverHelper.java
@@ -40,13 +40,13 @@ class GeoserverHelper extends Object {
 		final GeoServerRESTReader reader = config.getGeoServerReader();
 		final GeoServerRESTStoreManager storer = config.getGeoServerStoreManager();
 
-		final String ws = config.getProperty("rendering.server.rest.workspace");
+		final String ws = config.getRenderServerWorkspace();
 		final List<String> wsNames = reader.getWorkspaceNames();
 		if (!wsNames.contains(ws)) {
 			publisher.createWorkspace(ws);
 		}
 
-		final String ds = config.getProperty("rendering.server.rest.datastore");
+		final String ds = config.getRenderServerDatastore();
 		final RESTDataStore restDs = reader.getDatastore(ws, ds);
 		if (restDs == null) {
 			final GSPostGISDatastoreEncoder encoder = new GSPostGISDatastoreEncoder(ds);
@@ -112,8 +112,7 @@ class GeoserverHelper extends Object {
 	private void removeLayers() {
 		final GeoServerRESTPublisher publisher = config.getGeoServerPublisher();
 		final GeoServerRESTReader reader = config.getGeoServerReader();
-
-		final String ws = config.getProperty("rendering.server.rest.workspace");
+		final String ws = config.getRenderServerWorkspace();
 
 		final RESTLayerList allLayers = reader.getLayers();
 		if (allLayers != null) {
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 47df952d8536d22230250598f092d0f17e4638c3..c0fa8a73ff22586604b6a5ecf47c23da3a2046e0 100644
--- a/src/main/java/it/unibz/inf/isoga/web/JsonWebsocket.java
+++ b/src/main/java/it/unibz/inf/isoga/web/JsonWebsocket.java
@@ -100,7 +100,7 @@ public class JsonWebsocket {
 		final ConfigContainer configContainer = ConfigContainer.getInstance();
 		final ConfigWeb globalConfig = configContainer.getGlobalConfig();
 		final Connection connection = globalConfig.getConnection();
-		final String ws = globalConfig.getProperty("rendering.server.rest.workspace");
+		final String ws = globalConfig.getRenderServerWorkspace();
 		final GeoServerRESTPublisher publisher = globalConfig.getGeoServerPublisher();
 
 		final Collection<ConfigDataset> allClientDatasetConfigs = configContainer.getClientDatasetConfigList(clientId);