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 0119a8798120158ad2a2fe5a850e84d702ab2a4c..72d32c6538800b05c00963709ed7352a343b0549 100644
--- a/src/main/java/it/unibz/inf/isoga/service/AbstractService.java
+++ b/src/main/java/it/unibz/inf/isoga/service/AbstractService.java
@@ -8,7 +8,7 @@ import it.unibz.inf.isoga.db.DbUtility;
 import it.unibz.inf.isoga.db.TableEntry;
 import it.unibz.inf.isoga.geometry.BBox;
 import it.unibz.inf.isoga.util.DSetConfig;
-import it.unibz.inf.isoga.websocket.ConfigurationContainer;
+import it.unibz.inf.isoga.web.ConfigurationContainer;
 
 import java.sql.Connection;
 import java.util.ArrayList;
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 786a2d9a55983d960e6f6d69d0e00fda18e44afd..2fa002130aa0f3abb2fb7907ad47bcb02563bd91 100644
--- a/src/main/java/it/unibz/inf/isoga/service/ServiceConfiguration.java
+++ b/src/main/java/it/unibz/inf/isoga/service/ServiceConfiguration.java
@@ -5,7 +5,7 @@ import it.unibz.inf.isochrone.util.Config;
 import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isoga.util.DSetConfig;
 import it.unibz.inf.isoga.util.IsogaConfig;
-import it.unibz.inf.isoga.websocket.ConfigurationContainer;
+import it.unibz.inf.isoga.web.ConfigurationContainer;
 
 import java.sql.Connection;
 
diff --git a/src/main/java/it/unibz/inf/isoga/servlet/CleanupThread.java b/src/main/java/it/unibz/inf/isoga/web/CleanupThread.java
similarity index 89%
rename from src/main/java/it/unibz/inf/isoga/servlet/CleanupThread.java
rename to src/main/java/it/unibz/inf/isoga/web/CleanupThread.java
index 31c3cd68e8e183a0164955438e15bb47bb4a216c..35dd668d3b65a98c98e2c6ae50b7df775b7d6151 100644
--- a/src/main/java/it/unibz/inf/isoga/servlet/CleanupThread.java
+++ b/src/main/java/it/unibz/inf/isoga/web/CleanupThread.java
@@ -1,11 +1,10 @@
-package it.unibz.inf.isoga.servlet;
+package it.unibz.inf.isoga.web;
 
 import it.geosolutions.geoserver.rest.GeoServerRESTPublisher;
 import it.geosolutions.geoserver.rest.GeoServerRESTReader;
 import it.geosolutions.geoserver.rest.decoder.RESTLayerList;
 import it.unibz.inf.isochrone.util.Config;
 import it.unibz.inf.isoga.db.DbUtility;
-import it.unibz.inf.isoga.websocket.ConfigurationContainer;
 
 import java.sql.Connection;
 import java.util.List;
@@ -13,17 +12,16 @@ import java.util.List;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-class CleanupThread extends Thread {
-	private static final Logger LOGGER = LoggerFactory.getLogger(CleanupThread.class.getName());
+class CleanupTask extends Object {
+	private static final Logger LOGGER = LoggerFactory.getLogger(CleanupTask.class.getName());
 	private static final int SLEEP_TIME = 1000;
 
-	@Override
-	public void run() {
+	public void performCleanup() {
 		final Config config = ConfigurationContainer.getGlobalConfig();
 		final GeoServerRESTReader reader = config.getGeoServerReader();
 		while (!reader.existGeoserver()) {
 			try {
-				sleep(SLEEP_TIME);
+				wait(SLEEP_TIME);
 			} catch (final InterruptedException e1) {
 				e1.printStackTrace();
 			}
diff --git a/src/main/java/it/unibz/inf/isoga/websocket/ConfigurationContainer.java b/src/main/java/it/unibz/inf/isoga/web/ConfigurationContainer.java
similarity index 99%
rename from src/main/java/it/unibz/inf/isoga/websocket/ConfigurationContainer.java
rename to src/main/java/it/unibz/inf/isoga/web/ConfigurationContainer.java
index 0c86377c7a22daccceaef2ef6b445d51d701e338..a09e0c4acabf8cd8b47c712a1b9b2708b8a5710b 100644
--- a/src/main/java/it/unibz/inf/isoga/websocket/ConfigurationContainer.java
+++ b/src/main/java/it/unibz/inf/isoga/web/ConfigurationContainer.java
@@ -1,4 +1,4 @@
-package it.unibz.inf.isoga.websocket;
+package it.unibz.inf.isoga.web;
 
 import it.unibz.inf.isochrone.util.Config;
 import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
diff --git a/src/main/java/it/unibz/inf/isoga/websocket/JsonWebsocket.java b/src/main/java/it/unibz/inf/isoga/web/JsonWebsocket.java
similarity index 99%
rename from src/main/java/it/unibz/inf/isoga/websocket/JsonWebsocket.java
rename to src/main/java/it/unibz/inf/isoga/web/JsonWebsocket.java
index 33883c0c8184166418fdf4b35cad7a260b6cf5e8..4d6f8bb33047ec19d75d1d378640f74cb678e2ac 100644
--- a/src/main/java/it/unibz/inf/isoga/websocket/JsonWebsocket.java
+++ b/src/main/java/it/unibz/inf/isoga/web/JsonWebsocket.java
@@ -1,4 +1,4 @@
-package it.unibz.inf.isoga.websocket;
+package it.unibz.inf.isoga.web;
 
 import it.geosolutions.geoserver.rest.GeoServerRESTPublisher;
 import it.unibz.inf.isochrone.util.Config;
diff --git a/src/main/java/it/unibz/inf/isoga/servlet/StartupServlet.java b/src/main/java/it/unibz/inf/isoga/web/StartupListener.java
similarity index 54%
rename from src/main/java/it/unibz/inf/isoga/servlet/StartupServlet.java
rename to src/main/java/it/unibz/inf/isoga/web/StartupListener.java
index 2306bf004f2a605a414fb4df7eecd1071fa46e73..d4fa3d1fe53e31b075c07885e91847b10b91ed46 100644
--- a/src/main/java/it/unibz/inf/isoga/servlet/StartupServlet.java
+++ b/src/main/java/it/unibz/inf/isoga/web/StartupListener.java
@@ -1,18 +1,18 @@
-package it.unibz.inf.isoga.servlet;
+package it.unibz.inf.isoga.web;
 
-import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.annotation.WebListener;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@WebServlet(name = "StartupServlet", loadOnStartup = 1)
-public class StartupServlet extends HttpServlet {
-	private static final long serialVersionUID = 7599924678364708340L;
-	private static final Logger LOGGER = LoggerFactory.getLogger(StartupServlet.class.getName());
+@WebListener
+public class StartupListener implements ServletContextListener {
+	private static final Logger LOGGER = LoggerFactory.getLogger(StartupListener.class.getName());
 
 	@Override
-	public void init() {
+	public void contextInitialized(final ServletContextEvent sce) {
 		// TODO: Implement startup checks
 
 		// 1) Is there a readable configuration?
@@ -25,12 +25,19 @@ public class StartupServlet extends HttpServlet {
 		startCleanup();
 	}
 
+	@Override
+	public void contextDestroyed(final ServletContextEvent sce) {
+		// TODO: What should we do on shutdown?
+	}
+
 	// Private methods
 
 	private void startCleanup() {
 		LOGGER.info("Starting cleanup thread");
-		final Thread t = new CleanupThread();
-		t.start();
+
+		final CleanupTask ct = new CleanupTask();
+		ct.performCleanup();
 	}
 
+
 }
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index c0bff458e218a7a5f9048260d3c0142be0931381..cf6c68b8f7c65effeadb6a7461c4fc6a73d38b86 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<web-app version="3.0" metadata-complete="false" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
+<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 	<display-name>Using Isochrones for Geospatial Analysis</display-name>
 </web-app>