diff --git a/org.eclipse.virgo.apps.splash/src/main/java/org/eclipse/virgo/apps/splash/ContentServlet.java b/org.eclipse.virgo.apps.splash/src/main/java/org/eclipse/virgo/apps/splash/ContentServlet.java
index 2da0dbd..90c4071 100644
--- a/org.eclipse.virgo.apps.splash/src/main/java/org/eclipse/virgo/apps/splash/ContentServlet.java
+++ b/org.eclipse.virgo.apps.splash/src/main/java/org/eclipse/virgo/apps/splash/ContentServlet.java
@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.eclipse.virgo.apps.splash;
 
 import java.io.File;
@@ -23,6 +24,7 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -46,189 +48,189 @@
  * @author Christopher Frost
  */
 public class ContentServlet extends HttpServlet {
-	
-	private static final Logger log = LoggerFactory.getLogger(ContentServlet.class);
 
-	private static final long serialVersionUID = 1L;
+    private static final Logger log = LoggerFactory.getLogger(ContentServlet.class);
 
-	private static final String HTTP_CONTENT_LENGTH_HEADER = "Content-Length";
+    private static final long serialVersionUID = 1L;
 
-	private static final String HTTP_LAST_MODIFIED_HEADER = "Last-Modified";
+    private static final String HTTP_CONTENT_LENGTH_HEADER = "Content-Length";
 
-	private static final String HTTP_EXPIRES_HEADER = "Expires";
+    private static final String HTTP_LAST_MODIFIED_HEADER = "Last-Modified";
 
-	private static final String HTTP_CACHE_CONTROL_HEADER = "Cache-Control";
-	
-	private static final String PATH_TO_VERSION_FILE = "lib/.version";
-	
-	private static final String VERSION_HOLDER = "<!--@<version@-->";
-	
-	private String view = "/WEB-INF/splash.html";
-	
-	private boolean gzipEnabled = true;
-	
-	private final String version;
-	
-	private int cacheTimeout = 60; //The number of seconds content should be cached by the client. Zero disables caching, 31556926 is one year.
+    private static final String HTTP_EXPIRES_HEADER = "Expires";
 
-	private Map<String, String> defaultMimeTypes = new HashMap<String, String>();
-	{
-		defaultMimeTypes.put(".html",  "text/html");
-		defaultMimeTypes.put(".htm",   "text/html");
-		defaultMimeTypes.put(".xhtml", "text/html");
-	}
+    private static final String HTTP_CACHE_CONTROL_HEADER = "Cache-Control";
 
-	private Set<String> compressedMimeTypes = new HashSet<String>();
-	{
-		compressedMimeTypes.add("text/.*");
-		compressedMimeTypes.add(".*/xhtml.xml");
-	}
-	
+    private static final String PATH_TO_VERSION_FILE = "lib/.version";
+
+    private static final String VERSION_HOLDER = "<!--@<version@-->";
+
+    private String view = "/WEB-INF/splash.html";
+
+    private boolean gzipEnabled = true;
+
+    private final String version;
+
+    private int cacheTimeout = 60; // The number of seconds content should be cached by the client. Zero disables
+                                   // caching, 31556926 is one year.
+
+    private Map<String, String> defaultMimeTypes = new HashMap<String, String>();
+    {
+        defaultMimeTypes.put(".html", "text/html");
+        defaultMimeTypes.put(".htm", "text/html");
+        defaultMimeTypes.put(".xhtml", "text/html");
+    }
+
+    private Set<String> compressedMimeTypes = new HashSet<String>();
+    {
+        compressedMimeTypes.add("text/.*");
+        compressedMimeTypes.add(".*/xhtml.xml");
+    }
+
     public ContentServlet() {
         this.version = readServerVersion();
     }
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-		URL resource = getRequestedContentURL(this.view);
-		prepareContentResponse(response, resource);
-		PrintWriter out = selectOutputStream(request, response);
-		try {
-			URLConnection resourceConn = resource.openConnection();
-			InputStream in = resourceConn.getInputStream();
-			try {
-				this.parse(in, out);
-			} finally {
-				in.close();
-			}
-		} finally {
-			out.close();
-		}
-	}
-	
-	private void parse(InputStream in, PrintWriter out) {
-		Scanner scanner = new Scanner(in);
-		String parsedLine;
-		while (scanner.hasNextLine()) {
-			parsedLine = parseLine(scanner.nextLine());
-			if(parsedLine != null && !parsedLine.trim().isEmpty()){
-				out.append(parsedLine);
-				out.append('\n');
-			}
-		}
-	}
 
-	private String parseLine(String line) {
-		if(line.contains(VERSION_HOLDER)){
-			int offset = line.indexOf(VERSION_HOLDER);
-			line = String.format("%s%s%s", line.substring(0, offset), this.version, line.substring(offset + VERSION_HOLDER.length()));
-		}
-		return line;
-	}
-	
-	private PrintWriter selectOutputStream(HttpServletRequest request, HttpServletResponse response) throws IOException {
-		String acceptEncoding = request.getHeader("Accept-Encoding");
-		String mimeType = response.getContentType();
-		if (gzipEnabled && 
-				acceptEncoding != null && 
-				acceptEncoding.indexOf("gzip") > -1 && 
-				matchesCompressedMimeTypes(mimeType)) {
-			log.debug("Enabling GZIP compression for the current response.");
-			return new PrintWriter(new GZIPResponseStream(response));
-		} else {
-			return response.getWriter();
-		}
-	}
+    /**
+     * {@inheritDoc}
+     */
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        URL resource = getRequestedContentURL(this.view);
+        prepareContentResponse(response, resource);
+        PrintWriter out = selectOutputStream(request, response);
+        try {
+            URLConnection resourceConn = resource.openConnection();
+            InputStream in = resourceConn.getInputStream();
+            try {
+                this.parse(in, out);
+            } finally {
+                in.close();
+            }
+        } finally {
+            out.close();
+        }
+    }
 
-	private boolean matchesCompressedMimeTypes(String mimeType) {
-		for(String compressedMimeType: compressedMimeTypes){
-			if(mimeType.matches(compressedMimeType)){
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	private void prepareContentResponse(HttpServletResponse response, URL resource) throws IOException {	
-		URLConnection resourceConn = resource.openConnection();
-		String mimeType = getServletContext().getMimeType(resource.getPath());
-		if (mimeType == null) {
-			String extension = resource.getPath().substring(resource.getPath().lastIndexOf('.'));
-			mimeType = (String) defaultMimeTypes.get(extension);
-		}
-		response.setContentType(mimeType);
-		response.setHeader(HTTP_CONTENT_LENGTH_HEADER, Long.toString(resourceConn.getContentLength()));
-		response.setDateHeader(HTTP_LAST_MODIFIED_HEADER, resourceConn.getLastModified());
-		if (cacheTimeout > 0) {
-			configureCaching(response, cacheTimeout);
-		}
-	}
+    private void parse(InputStream in, PrintWriter out) {
+        try (Scanner scanner = new Scanner(in, StandardCharsets.UTF_8.name())) {
+            String parsedLine;
+            while (scanner.hasNextLine()) {
+                parsedLine = parseLine(scanner.nextLine());
+                if (parsedLine != null && !parsedLine.trim().isEmpty()) {
+                    out.append(parsedLine);
+                    out.append('\n');
+                }
+            }
+        }
+    }
 
-	/**
-	 * {@inheritDoc}
-	 */
-	protected long getLastModified(HttpServletRequest request) {
-		String rawRequestPath = request.getPathInfo();
-		if (log.isDebugEnabled()) {
-			log.debug("Checking last modified of content: " + rawRequestPath);
-		}
-		URL resource;
-		try {
-			resource = getRequestedContentURL(rawRequestPath);
-		} catch (MalformedURLException e) {
-			return -1;
-		}
-		if (resource == null) {
-			return -1;
-		}
-		try {
-			return resource.openConnection().getLastModified();
-		} catch (IOException e) {
-			return -1;
-		}
-	}
+    private String parseLine(String line) {
+        if (line.contains(VERSION_HOLDER)) {
+            int offset = line.indexOf(VERSION_HOLDER);
+            line = String.format("%s%s%s", line.substring(0, offset), this.version, line.substring(offset + VERSION_HOLDER.length()));
+        }
+        return line;
+    }
 
-	private URL getRequestedContentURL(String rawRequestPath) throws MalformedURLException {
-		URL resource = getServletContext().getResource(rawRequestPath);
-		if (resource == null) {
-			if (log.isDebugEnabled()) {
-				log.debug("Content not found: " + rawRequestPath);
-			}
-		}
-		return resource;
-	}
+    private PrintWriter selectOutputStream(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        String acceptEncoding = request.getHeader("Accept-Encoding");
+        String mimeType = response.getContentType();
+        if (gzipEnabled && acceptEncoding != null && acceptEncoding.indexOf("gzip") > -1 && matchesCompressedMimeTypes(mimeType)) {
+            log.debug("Enabling GZIP compression for the current response.");
+            return new PrintWriter(new GZIPResponseStream(response));
+        } else {
+            return response.getWriter();
+        }
+    }
 
-	/**
-	 * Set HTTP headers to allow caching for the given number of seconds.
-	 * @param seconds number of seconds into the future that the response should be cacheable for
-	 */
-	private void configureCaching(HttpServletResponse response, int seconds) {
-		response.setDateHeader(HTTP_EXPIRES_HEADER, System.currentTimeMillis() + seconds * 1000L); // HTTP 1.0 header
-		response.setHeader(HTTP_CACHE_CONTROL_HEADER, "max-age=" + seconds);// HTTP 1.1 header
-	}
-	
-	private String readServerVersion(){
-	    String readVersion;
-			File versionFile = new File(PATH_TO_VERSION_FILE);
-			Properties versions = new Properties();
-			InputStream stream = null;
-			try {
-				stream = new FileInputStream(versionFile);
-				versions.load(stream);
-				readVersion = versions.getProperty("virgo.server.version");
-				stream.close();
-			} catch (IOException e) {
-				readVersion = "";
-				try {
-					if(stream != null){
-						stream.close();
-					}
-				} catch (IOException e1) {
-					// no-op
-				}
-		}
-		return readVersion;
-	}
+    private boolean matchesCompressedMimeTypes(String mimeType) {
+        for (String compressedMimeType : compressedMimeTypes) {
+            if (mimeType.matches(compressedMimeType)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void prepareContentResponse(HttpServletResponse response, URL resource) throws IOException {
+        URLConnection resourceConn = resource.openConnection();
+        String mimeType = getServletContext().getMimeType(resource.getPath());
+        if (mimeType == null) {
+            String extension = resource.getPath().substring(resource.getPath().lastIndexOf('.'));
+            mimeType = (String) defaultMimeTypes.get(extension);
+        }
+        response.setContentType(mimeType);
+        response.setHeader(HTTP_CONTENT_LENGTH_HEADER, Long.toString(resourceConn.getContentLength()));
+        response.setDateHeader(HTTP_LAST_MODIFIED_HEADER, resourceConn.getLastModified());
+        if (cacheTimeout > 0) {
+            configureCaching(response, cacheTimeout);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected long getLastModified(HttpServletRequest request) {
+        String rawRequestPath = request.getPathInfo();
+        if (log.isDebugEnabled()) {
+            log.debug("Checking last modified of content: " + rawRequestPath);
+        }
+        URL resource;
+        try {
+            resource = getRequestedContentURL(rawRequestPath);
+        } catch (MalformedURLException e) {
+            return -1;
+        }
+        if (resource == null) {
+            return -1;
+        }
+        try {
+            return resource.openConnection().getLastModified();
+        } catch (IOException e) {
+            return -1;
+        }
+    }
+
+    private URL getRequestedContentURL(String rawRequestPath) throws MalformedURLException {
+        URL resource = getServletContext().getResource(rawRequestPath);
+        if (resource == null) {
+            if (log.isDebugEnabled()) {
+                log.debug("Content not found: " + rawRequestPath);
+            }
+        }
+        return resource;
+    }
+
+    /**
+     * Set HTTP headers to allow caching for the given number of seconds.
+     * 
+     * @param seconds number of seconds into the future that the response should be cacheable for
+     */
+    private void configureCaching(HttpServletResponse response, int seconds) {
+        response.setDateHeader(HTTP_EXPIRES_HEADER, System.currentTimeMillis() + seconds * 1000L); // HTTP 1.0 header
+        response.setHeader(HTTP_CACHE_CONTROL_HEADER, "max-age=" + seconds); // HTTP 1.1 header
+    }
+
+    private String readServerVersion() {
+        String readVersion;
+        File versionFile = new File(PATH_TO_VERSION_FILE);
+        Properties versions = new Properties();
+        InputStream stream = null;
+        try {
+            stream = new FileInputStream(versionFile);
+            versions.load(stream);
+            readVersion = versions.getProperty("virgo.server.version");
+            stream.close();
+        } catch (IOException e) {
+            readVersion = "";
+            try {
+                if (stream != null) {
+                    stream.close();
+                }
+            } catch (IOException e1) {
+                // no-op
+            }
+        }
+        return readVersion;
+    }
 }
