diff --git a/src/main/java/it/unibz/inf/isochrones/utils/Config.java b/src/main/java/it/unibz/inf/isochrones/utils/Config.java
index 4576bf3a00227ddadc74383b57fe11fecfb6aee6..06c9ca4758715bb859ca0d5b8b51cc029db2aff7 100644
--- a/src/main/java/it/unibz/inf/isochrones/utils/Config.java
+++ b/src/main/java/it/unibz/inf/isochrones/utils/Config.java
@@ -86,7 +86,7 @@ public class Config {
 
 	/**
 	 * 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
 	 */
@@ -131,7 +131,7 @@ public class Config {
 	 * Method appendPropertyFile
 	 * </p>
 	 * appends the properties of that stream. An existing property is overwritten
-	 * 
+	 *
 	 * @param inputStream
 	 */
 	public void appendPropertyFile(final InputStream inputStream) {
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 83fb3aa916d3786c1893e6b371b8944d9bf09d38..9a50b41c25c30f394ed9f7df408b1abe0421862a 100644
--- a/src/main/java/it/unibz/inf/isoga/db/DBUtility.java
+++ b/src/main/java/it/unibz/inf/isoga/db/DBUtility.java
@@ -60,13 +60,13 @@ public final class DBUtility {
 				+ " (\"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 srid) {
+	public static void insertGeometryMetadata(final Connection connection, final TableEntry tableEntry, final int serverSrid) {
 		CallableStatement prepareCall = null;
 		try {
 			prepareCall = connection.prepareCall("{call addgeometrycolumn(?,?,?,?,?,true)}");
 			prepareCall.setString(1, tableEntry.getTableName());
 			prepareCall.setString(2, "GEOMETRY");
-			prepareCall.setInt(3, srid);
+			prepareCall.setInt(3, serverSrid);
 			prepareCall.setString(4, tableEntry.getGeometryType());
 			prepareCall.setInt(5, 2);
 			prepareCall.executeUpdate();
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 9df6ff14507fe9de7c61937e63093be589271efc..453bb7d6ee1645f894282e7347be21b15055ad70 100644
--- a/src/main/java/it/unibz/inf/isoga/geometry/BBox.java
+++ b/src/main/java/it/unibz/inf/isoga/geometry/BBox.java
@@ -19,10 +19,10 @@ public class BBox implements Comparable<BBox> {
 	}
 
 	public BBox(final Point lowerCorner, final Point upperCorner) {
-		minX = Math.round(lowerCorner.getX());
-		minY = Math.round(lowerCorner.getY());
-		maxX = Math.round(upperCorner.getX());
-		maxY = Math.round(upperCorner.getY());
+		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());
 	}
 
 	public JSONArray toJSON() throws JSONException {
diff --git a/src/main/java/it/unibz/inf/isoga/services/IsochroneService.java b/src/main/java/it/unibz/inf/isoga/services/IsochroneService.java
index 71b5d75c411728b999671be3c2bfc4e74886ae08..d5cd4ab8849b9dfcbdc871c755a182892ce77023 100644
--- a/src/main/java/it/unibz/inf/isoga/services/IsochroneService.java
+++ b/src/main/java/it/unibz/inf/isoga/services/IsochroneService.java
@@ -223,7 +223,7 @@ public class IsochroneService extends AbstractService {
 		// only register dataset bz, all others are registered later
 		final DSetConfig cfgBZ = sessionServerConfigs.get(client.getId()).get(Dataset.BZ);
 		final Connection connection = globalCFG.getConnection();
-		registerLayer(connection, cfgBZ, manager.getPublisher(), client.getId());
+		registerLayers(connection, cfgBZ, manager.getPublisher());
 
 		// listener that listens when client is closed
 		client.addListener(new ServerSession.RemoveListener() {
@@ -253,77 +253,67 @@ public class IsochroneService extends AbstractService {
 	/**
 	 * Creates the tables and for every session a new datastore via rest.
 	 */
-	private void registerLayer(final Connection connection, final DSetConfig dSetConfig,
-			final GeoServerRESTPublisher publisher, final String sessionId) {
-		// register edge table
-		DBUtility.deleteGeometryMetadata(connection, dSetConfig.getEdgeTableEntry());
-		DBUtility.createTargetEdgeTable(connection, dSetConfig.getEdgeTableEntry().getTableName());
-		DBUtility.insertGeometryMetadata(connection, dSetConfig.getEdgeTableEntry(), dSetConfig.getServerSRID());
-		DBUtility.createSpatialIndex(connection, dSetConfig.getEdgeTableEntry());
-
-		final GSFeatureTypeEncoder edgeFeatureTypeEncoder = new GSFeatureTypeEncoder();
-		edgeFeatureTypeEncoder.setName(dSetConfig.getEdgeTableEntry().getTableName());
-		edgeFeatureTypeEncoder.setTitle(dSetConfig.getEdgeTableEntry().getDescription());
-		final String srs = "EPSG:" + dSetConfig.getServerSRID();
-		edgeFeatureTypeEncoder.setSRS(srs);
-		edgeFeatureTypeEncoder.setNativeBoundingBox(dSetConfig.getServerExtent().getMinX(),
-				dSetConfig.getServerExtent().getMinY(),
-				dSetConfig.getServerExtent().getMaxX(),
-				dSetConfig.getServerExtent().getMaxY(), srs);
+	private void registerLayers(final Connection connection, final DSetConfig dSetConfig, final GeoServerRESTPublisher publisher) {
+		final String ds = globalCFG.getProperty("rendering.server.rest.datastore");
+		final String ws = globalCFG.getProperty("rendering.server.rest.workspace");
+		final BBox serverExtend = dSetConfig.getServerExtent();
+		final int serverSrid = dSetConfig.getServerSRID();
+		final String srs = "EPSG:" + serverSrid;
 
+		// register edge table
+		final TableEntry edgeTableEntry = dSetConfig.getEdgeTableEntry();
+		DBUtility.deleteGeometryMetadata(connection, edgeTableEntry);
+		DBUtility.createTargetEdgeTable(connection, edgeTableEntry.getTableName());
+		DBUtility.insertGeometryMetadata(connection, edgeTableEntry, serverSrid);
+		DBUtility.createSpatialIndex(connection, edgeTableEntry);
+		final GSFeatureTypeEncoder edgeFeatureTypeEncoder = getFeatureEncoder(edgeTableEntry, serverExtend, srs);
 		final GSLayerEncoder edgeLayerEncoder = new GSLayerEncoder();
 		edgeLayerEncoder.setDefaultStyle("STYLE_ISO_EDGES");
-
-		if (!publisher.publishDBLayer(globalCFG.getProperty("rendering.server.rest.workspace"),
-				globalCFG.getProperty("rendering.server.rest.datastore"),
-				edgeFeatureTypeEncoder, edgeLayerEncoder)) {
-			throw new RuntimeException("Couldn't register layer on the GeoServer");
+		if (!publisher.publishDBLayer(ws, ds, edgeFeatureTypeEncoder, edgeLayerEncoder)) {
+			throw new RuntimeException("Couldn't register edge layer on the GeoServer");
 		}
 
-		DBUtility.createVertexAnnotationTable(connection,
-				dSetConfig.getVertexAnnotatedTableEntry().getTableName());
-
 		// register vertex table
-		DBUtility.deleteGeometryMetadata(connection, dSetConfig.getVertexTableEntry());
-		DBUtility.createTargetVertexTable(connection, dSetConfig.getVertexTableEntry().getTableName());
-		DBUtility.insertGeometryMetadata(connection, dSetConfig.getVertexTableEntry(), dSetConfig.getServerSRID());
-		DBUtility.createSpatialIndex(connection, dSetConfig.getVertexTableEntry());
-
-		final GSFeatureTypeEncoder vertexFeatureTypeEncoder = new GSFeatureTypeEncoder();
-		vertexFeatureTypeEncoder.setName(dSetConfig.getVertexTableEntry().getTableName());
-		vertexFeatureTypeEncoder.setTitle(dSetConfig.getVertexTableEntry().getDescription());
-		vertexFeatureTypeEncoder.setSRS(srs);
-		vertexFeatureTypeEncoder.setNativeBoundingBox(dSetConfig.getServerExtent().getMinX(),
-				dSetConfig.getServerExtent().getMinY(),
-				dSetConfig.getServerExtent().getMaxX(),
-				dSetConfig.getServerExtent().getMaxY(), srs);
+		final TableEntry vertexTableEntry = dSetConfig.getVertexTableEntry();
+		final TableEntry annotatedTableEntry = dSetConfig.getVertexAnnotatedTableEntry();
+		DBUtility.createVertexAnnotationTable(connection, annotatedTableEntry.getTableName());
+		DBUtility.deleteGeometryMetadata(connection, vertexTableEntry);
+		DBUtility.createTargetVertexTable(connection, vertexTableEntry.getTableName());
+		DBUtility.insertGeometryMetadata(connection, vertexTableEntry, serverSrid);
+		DBUtility.createSpatialIndex(connection, vertexTableEntry);
+		final GSFeatureTypeEncoder vertexFeatureTypeEncoder = getFeatureEncoder(vertexTableEntry, serverExtend, srs);
 		final GSLayerEncoder vertexLayerEncoder = new GSLayerEncoder();
 		vertexLayerEncoder.setDefaultStyle("STYLE_VERTICES_EXPIRATION");
-		publisher.publishDBLayer(globalCFG.getProperty("rendering.server.rest.workspace"),
-				globalCFG.getProperty("rendering.server.rest.datastore"),
-				vertexFeatureTypeEncoder, vertexLayerEncoder);
+		if (!publisher.publishDBLayer(ws, ds, vertexFeatureTypeEncoder, vertexLayerEncoder)) {
+			throw new RuntimeException("Couldn't register vertex layer on the GeoServer");
+		}
+
+		final TableEntry areaBufferTableEntry = dSetConfig.getAreaBufferTableEntry();
+		DBUtility.deleteGeometryMetadata(connection, areaBufferTableEntry);
+		DBUtility.createTargetBufferTable(connection, areaBufferTableEntry.getTableName());
+		DBUtility.insertGeometryMetadata(connection, areaBufferTableEntry, serverSrid);
+		DBUtility.createSpatialIndex(connection, areaBufferTableEntry);
+		final GSFeatureTypeEncoder bufferFeatureTypeEncoder = getFeatureEncoder(areaBufferTableEntry, serverExtend, srs);
+		final GSLayerEncoder bufferLayerEncoder = new GSLayerEncoder();
+		bufferLayerEncoder.setDefaultStyle("STYLE_ISO_AREA");
+		if (!publisher.publishDBLayer(ws, ds, bufferFeatureTypeEncoder, bufferLayerEncoder)) {
+			throw new RuntimeException("Couldn't register areaBuffer layer on the GeoServer");
+		}
 
-		DBUtility.deleteGeometryMetadata(connection, dSetConfig.getAreaBufferTableEntry());
-		DBUtility.createTargetBufferTable(connection, dSetConfig.getAreaBufferTableEntry().getTableName());
-		DBUtility.insertGeometryMetadata(connection, dSetConfig.getAreaBufferTableEntry(),
-				dSetConfig.getServerSRID());
-		DBUtility.createSpatialIndex(connection, dSetConfig.getAreaBufferTableEntry());
+		dSetConfig.register();
+	}
 
+	private GSFeatureTypeEncoder getFeatureEncoder(final TableEntry tEntry, final BBox serverExtend, final String srs) {
 		final GSFeatureTypeEncoder bufferFeatureTypeEncoder = new GSFeatureTypeEncoder();
-		bufferFeatureTypeEncoder.setName(dSetConfig.getAreaBufferTableEntry().getTableName());
-		bufferFeatureTypeEncoder.setTitle(dSetConfig.getAreaBufferTableEntry().getDescription());
+		bufferFeatureTypeEncoder.setName(tEntry.getTableName());
+		bufferFeatureTypeEncoder.setTitle(tEntry.getDescription());
 		bufferFeatureTypeEncoder.setSRS(srs);
-		bufferFeatureTypeEncoder.setNativeBoundingBox(dSetConfig.getServerExtent().getMinX(),
-				dSetConfig.getServerExtent().getMinY(),
-				dSetConfig.getServerExtent().getMaxX(),
-				dSetConfig.getServerExtent().getMaxY(), srs);
+		bufferFeatureTypeEncoder.setNativeBoundingBox(serverExtend.getMinX(),
+				serverExtend.getMinY(),
+				serverExtend.getMaxX(),
+				serverExtend.getMaxY(), srs);
 
-		final GSLayerEncoder bufferLayerEncoder = new GSLayerEncoder();
-		bufferLayerEncoder.setDefaultStyle("STYLE_ISO_AREA");
-		publisher.publishDBLayer(globalCFG.getProperty("rendering.server.rest.workspace"),
-				globalCFG.getProperty("rendering.server.rest.datastore"),
-				bufferFeatureTypeEncoder, bufferLayerEncoder);
-		dSetConfig.register();
+		return bufferFeatureTypeEncoder;
 	}
 
 	private Set<Location> locationsFromQueryPoints(final String qPoints, final Config config) {
@@ -390,7 +380,7 @@ public class IsochroneService extends AbstractService {
 		final DSetConfig dSetConfig = sessionServerConfigs.get(client.getId()).get(dataset);
 		if (!dSetConfig.isRegistered()) {
 			final Connection connection = config.getConnection();
-			registerLayer(connection, dSetConfig, manager.getPublisher(), client.getId());
+			registerLayers(connection, dSetConfig, manager.getPublisher());
 		}
 		config.setDestinationEdgeTableEntry(dSetConfig.getEdgeTableEntry());
 		config.setDestinationVertexTableEntry(dSetConfig.getVertexTableEntry());
@@ -580,7 +570,7 @@ public class IsochroneService extends AbstractService {
 	 * schedule data of the means of transport passing there. It delivers for each
 	 * mean of transport that passes at that vertex: the type,name of means of
 	 * transportation system and the corresponding arrival or departure time
-	 * 
+	 *
 	 * @param client
 	 * @param message
 	 *          passes an identifier of the transit station
diff --git a/src/main/java/it/unibz/inf/isoga/utils/DSetConfig.java b/src/main/java/it/unibz/inf/isoga/utils/DSetConfig.java
index b1d7cd6f65582b10af393977f694f0577e0661e2..a76df68831ef8ecea329f2b01c4593c573ce066d 100644
--- a/src/main/java/it/unibz/inf/isoga/utils/DSetConfig.java
+++ b/src/main/java/it/unibz/inf/isoga/utils/DSetConfig.java
@@ -9,6 +9,7 @@ import it.unibz.inf.isoga.geometry.BBox;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
+import java.util.Date;
 
 import org.json.JSONArray;
 import org.json.JSONException;
@@ -18,21 +19,20 @@ import org.json.JSONObject;
  * Configuration for individual datasets.
  */
 public class DSetConfig implements Cloneable {
+	private static final DateFormat CLIENT_DATE_FORMAT = new SimpleDateFormat("dd'/'MM'/'yyyy");
+	private static final DateFormat CLIENT_TIME_FORMAT = new SimpleDateFormat("HH':'mm");
+	private static final int NAME_MAX_LENGTH = 15;
 	private final Dataset dataset;
-	private final BBox clientMBR, serverMBR;
-
+	private final BBox clientMBR;
+	private final BBox serverMBR;
 	private final Calendar time;
 	private final Point queryPoint;
-	private String edgeLayer, vertexLayer, areaBufferLayer, vertexAnnotatedTableName;
-	private TableEntry edgeTableEntry, vertexTableEntry, areaBufferTableEntry, vertexAnnotatedTableEntry;
-
 	private final int serverSRID;
 	private final String workspace;
+	private String edgeLayer, vertexLayer, areaBufferLayer, vertexAnnotatedTableName;
+	private TableEntry edgeTableEntry, vertexTableEntry, areaBufferTableEntry, vertexAnnotatedTableEntry;
 	private boolean registered = false;
 
-	private static final DateFormat CLIENT_DATE_FORMAT = new SimpleDateFormat("dd'/'MM'/'yyyy");
-	private static final DateFormat CLIENT_TIME_FORMAT = new SimpleDateFormat("HH':'mm");
-
 	public DSetConfig(final Dataset dataset, final BBox serverMBR, final BBox clientMBR, final Calendar time, final Point queryPoint, final int serverSRID, final String workspace) {
 		this.dataset = dataset;
 		this.serverMBR = serverMBR;
@@ -68,45 +68,46 @@ public class DSetConfig implements Cloneable {
 	}
 
 	public JSONObject toJSON() {
-		final JSONObject json = new JSONObject();
-		final JSONObject qPoint = new JSONObject();
-		final JSONArray bboxVals = new JSONArray();
-		final JSONObject edgeLayer = new JSONObject();
-		final JSONObject vertexLayer = new JSONObject();
-		final JSONObject bufferLayer = new JSONObject();
-
+		final JSONObject resultObject = new JSONObject();
+		final JSONObject qPointObject = new JSONObject();
+		final JSONArray bboxValArray = new JSONArray();
+		final JSONObject edgeLayerObject = new JSONObject();
+		final JSONObject vertexLayerObject = new JSONObject();
+		final JSONObject bufferLayerObject = new JSONObject();
+
+		final Date date = time.getTime();
 		try {
-			json.put("name", dataset.toString());
-			json.put("date", CLIENT_DATE_FORMAT.format(time.getTime()));
-			json.put("time", CLIENT_TIME_FORMAT.format(time.getTime()));
-			json.put("prefix", workspace);
-
-			qPoint.put("x", queryPoint.getX());
-			qPoint.put("y", queryPoint.getY());
-			json.put("queryPoint", qPoint);
-
-			bboxVals.put(clientMBR.getMinX());
-			bboxVals.put(clientMBR.getMinY());
-			bboxVals.put(clientMBR.getMaxX());
-			bboxVals.put(clientMBR.getMaxY());
-			json.put(JSONConstants.BBOX, bboxVals);
-
-			edgeLayer.put("name", edgeTableEntry.getDescription());
-			edgeLayer.put("layer", edgeTableEntry.getTableName());
-			json.put("isoEdgeLayer", edgeLayer);
-
-			vertexLayer.put("name", vertexTableEntry.getDescription());
-			vertexLayer.put("layer", vertexTableEntry.getTableName());
-			json.put("isoVertexLayer", vertexLayer);
-
-			bufferLayer.put("name", areaBufferTableEntry.getDescription());
-			bufferLayer.put("layer", areaBufferTableEntry.getTableName());
-			json.put("isoCoverageLayer", bufferLayer);
+			resultObject.put("name", dataset.toString());
+			resultObject.put("prefix", workspace);
+			resultObject.put("date", CLIENT_DATE_FORMAT.format(date));
+			resultObject.put("time", CLIENT_TIME_FORMAT.format(date));
+
+			qPointObject.put("x", queryPoint.getX());
+			qPointObject.put("y", queryPoint.getY());
+			resultObject.put("queryPoint", qPointObject);
+
+			bboxValArray.put(clientMBR.getMinX());
+			bboxValArray.put(clientMBR.getMinY());
+			bboxValArray.put(clientMBR.getMaxX());
+			bboxValArray.put(clientMBR.getMaxY());
+			resultObject.put(JSONConstants.BBOX, bboxValArray);
+
+			edgeLayerObject.put("name", edgeTableEntry.getDescription());
+			edgeLayerObject.put("layer", edgeTableEntry.getTableName());
+			resultObject.put("isoEdgeLayer", edgeLayerObject);
+
+			vertexLayerObject.put("name", vertexTableEntry.getDescription());
+			vertexLayerObject.put("layer", vertexTableEntry.getTableName());
+			resultObject.put("isoVertexLayer", vertexLayerObject);
+
+			bufferLayerObject.put("name", areaBufferTableEntry.getDescription());
+			bufferLayerObject.put("layer", areaBufferTableEntry.getTableName());
+			resultObject.put("isoCoverageLayer", bufferLayerObject);
 		} catch (final JSONException e) {
 			e.printStackTrace();
 		}
 
-		return json;
+		return resultObject;
 	}
 
 	@Override
@@ -123,37 +124,15 @@ public class DSetConfig implements Cloneable {
 	}
 
 	public void appendSessionId(final String id) {
-		edgeLayer += "_" + id;
-		vertexLayer += "_" + id;
-		areaBufferLayer += "_" + id;
-		vertexAnnotatedTableName += "_" + id;
-
-		if (edgeLayer.length() > 15) {
-			String shortName = edgeLayer.substring(0, 10) + "_" + edgeLayer.substring(edgeLayer.length() - 6, edgeLayer.length());
-			shortName = shortName.toLowerCase();
-			edgeTableEntry = new TableEntry(shortName, "sidx_" + shortName, TableType.EDGE);
-			edgeLayer = shortName;
-		}
-
-		if (vertexLayer.length() > 15) {
-			String shortName = vertexLayer.substring(0, 10) + "_" + vertexLayer.substring(vertexLayer.length() - 6, vertexLayer.length());
-			shortName = shortName.toLowerCase();
-			vertexTableEntry = new TableEntry(shortName, "sidx_" + shortName, TableType.VERTEX);
-			vertexLayer = shortName;
-		}
-		if (vertexAnnotatedTableName.length() > 15) {
-			String shortName = vertexAnnotatedTableName.substring(0, 10) + "_" + vertexAnnotatedTableName.substring(vertexAnnotatedTableName.length() - 6, vertexAnnotatedTableName.length());
-			shortName = shortName.toLowerCase();
-			vertexAnnotatedTableEntry = new TableEntry(shortName, "sidx_" + shortName, TableType.VERTEX);
-			vertexAnnotatedTableName = shortName;
-		}
-		if (areaBufferLayer.length() > 15) {
-			String shortName = areaBufferLayer.substring(0, 10) + "_" + areaBufferLayer.substring(areaBufferLayer.length() - 6, areaBufferLayer.length());
-			shortName = shortName.toLowerCase();
-			areaBufferTableEntry = new TableEntry(shortName, "sidx_" + shortName, TableType.COVERAGE);
-			areaBufferLayer = shortName;
-		}
+		edgeLayer = appendId(edgeLayer, id);
+		vertexLayer = appendId(vertexLayer, id);
+		areaBufferLayer = appendId(areaBufferLayer, id);
+		vertexAnnotatedTableName = appendId(vertexAnnotatedTableName, id);
 
+		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);
 	}
 
 	public TableEntry getEdgeTableEntry() {
@@ -192,4 +171,15 @@ public class DSetConfig implements Cloneable {
 		return registered;
 	}
 
+	private String appendId(final String layerName, final String id) {
+		String name = layerName + "_" + id;
+		if (name.length() > NAME_MAX_LENGTH) {
+			// CHECKSTYLE:OFF MagicNumber
+			name = name.substring(0, 10) + "_" + name.substring(name.length() - 6, name.length());
+			// CHECKSTYLE:ON MagicNumber
+		}
+
+		return name.toLowerCase();
+	}
+
 }