diff --git a/src/main/java/bdv/server/BigDataServer.java b/src/main/java/bdv/server/BigDataServer.java
index c7d98cfedd613b79baa5fb59a138acf92f3771c9..4b6657033c8daebbd228729249dd121fa4fec18e 100644
--- a/src/main/java/bdv/server/BigDataServer.java
+++ b/src/main/java/bdv/server/BigDataServer.java
@@ -1,7 +1,5 @@
 package bdv.server;
 
-import java.util.HashMap;
-
 import mpicbg.spim.data.SpimDataException;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.ConnectorStatistics;
@@ -14,6 +12,8 @@ import org.eclipse.jetty.server.handler.StatisticsHandler;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.thread.QueuedThreadPool;
 
+import java.util.HashMap;
+
 public class BigDataServer
 {
 	static HashMap< String, String > dataSet = new HashMap<>();
diff --git a/src/main/java/bdv/server/CellHandler.java b/src/main/java/bdv/server/CellHandler.java
index 099597f0ef650c5499bea661726f440767a7f9a4..6a40ee954e8ca75a885c352a23ac0cb04454509f 100644
--- a/src/main/java/bdv/server/CellHandler.java
+++ b/src/main/java/bdv/server/CellHandler.java
@@ -1,23 +1,5 @@
 package bdv.server;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import mpicbg.spim.data.SpimDataException;
-import net.imglib2.img.basictypeaccess.volatiles.array.VolatileShortArray;
-import net.imglib2.realtransform.AffineTransform3D;
-
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.handler.ContextHandler;
-import org.jdom2.Document;
-import org.jdom2.output.Format;
-import org.jdom2.output.XMLOutputter;
-
 import bdv.img.cache.CacheHints;
 import bdv.img.cache.LoadingStrategy;
 import bdv.img.cache.VolatileCell;
@@ -29,8 +11,22 @@ import bdv.img.remote.RemoteImageLoaderMetaData;
 import bdv.spimdata.SequenceDescriptionMinimal;
 import bdv.spimdata.SpimDataMinimal;
 import bdv.spimdata.XmlIoSpimDataMinimal;
-
 import com.google.gson.GsonBuilder;
+import mpicbg.spim.data.SpimDataException;
+import net.imglib2.img.basictypeaccess.volatiles.array.VolatileShortArray;
+import net.imglib2.realtransform.AffineTransform3D;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.jdom2.Document;
+import org.jdom2.output.Format;
+import org.jdom2.output.XMLOutputter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
 
 public class CellHandler extends ContextHandler
 {
@@ -149,7 +145,6 @@ public class CellHandler extends ContextHandler
 			throw new ServletException( e );
 		}
 
-
 //		final SAXBuilder sax = new SAXBuilder();
 //		Document doc;
 //		try
@@ -179,4 +174,9 @@ public class CellHandler extends ContextHandler
 //		ow.write( new XMLOutputter().outputString( doc ) );
 //		ow.close();
 	}
+
+	public String getXmlFile()
+	{
+		return xmlFile;
+	}
 }
diff --git a/src/main/java/bdv/server/ManagerHandler.java b/src/main/java/bdv/server/ManagerHandler.java
index cb50f04ea907d4072c26f12ff6eb4243132c9225..577f44a17ec9c14f6ffa7f2f572b74acb4fd14cc 100644
--- a/src/main/java/bdv/server/ManagerHandler.java
+++ b/src/main/java/bdv/server/ManagerHandler.java
@@ -1,13 +1,8 @@
 package bdv.server;
 
-import java.io.IOException;
-import java.io.PrintWriter;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 import mpicbg.spim.data.SpimDataException;
+import org.antlr.stringtemplate.StringTemplate;
+import org.antlr.stringtemplate.StringTemplateGroup;
 import org.eclipse.jetty.server.ConnectorStatistics;
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.Request;
@@ -22,6 +17,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.net.URISyntaxException;
 import java.text.DecimalFormat;
 
 public class ManagerHandler extends ContextHandler
@@ -38,7 +34,7 @@ public class ManagerHandler extends ContextHandler
 	
 	private final ConnectorStatistics connectorStats;
 
-	public ManagerHandler( String baseURL, Server server, ConnectorStatistics connectorStats, StatisticsHandler statHandler, ContextHandlerCollection handlers )
+	public ManagerHandler( String baseURL, Server server, ConnectorStatistics connectorStats, StatisticsHandler statHandler, ContextHandlerCollection handlers ) throws IOException, URISyntaxException
 	{
 		this.baseURL = baseURL;
 		this.server = server;
@@ -92,34 +88,45 @@ public class ManagerHandler extends ContextHandler
 
 		final PrintWriter ow = response.getWriter();
 
-		ow.write( "<HTML>\n<HEAD><META HTTP-EQUIV=\"refresh\" CONTENT=\"5\"></HEAD>\n<BODY>" );
+		ow.write( getHtml() );
+		ow.close();
+	}
+
+	private String getHtml()
+	{
+		// manager.st should be under {WorkingFolder}/templates/
+		StringTemplateGroup templates =
+				new StringTemplateGroup( "manager", "templates" );
 
-		ow.write( "This page is refreshed in every 5 secs.<br/>\n" );
-		ow.write( "<br/>\n" );
-		ow.write( "Bytes sent total: " + getByteSizeString( statHandler.getResponsesBytesTotal() ) + "<br/>\n" );
+		StringTemplate t = templates.getInstanceOf( "manager" );
 
-		// Refer: http://download.eclipse.org/jetty/9.2.6.v20141205/apidocs/org/eclipse/jetty/server/ConnectorStatistics.html
-		ow.write( String.format( "%,d Message/sec<br/>%n", connectorStats.getMessagesOutPerSecond() ) );
+		t.setAttribute( "bytesSent", getByteSizeString( statHandler.getResponsesBytesTotal() ) );
+		t.setAttribute( "msgPerSec", connectorStats.getMessagesOutPerSecond() );
+		t.setAttribute( "openConnections", connectorStats.getConnectionsOpen() );
+		t.setAttribute( "maxOpenConnections", connectorStats.getConnectionsOpenMax() );
 
-		ow.write( String.format( "Open connections = %,d<br/>%n", connectorStats.getConnectionsOpen() ) );
-		ow.write( String.format( "Max open connections = %,d<br/>%n", connectorStats.getConnectionsOpenMax() ) );
+		t.setAttribute( "contexts", getContexts() );
 
-		ow.write( "<H1> Datasets: </H1>\n" );
+		t.setAttribute( "statHtml", statHandler.toStatsHTML() );
 
-		for ( final Handler handler : server.getChildHandlersByClass( CellHandler.class ) )
+		return t.toString();
+	}
+
+	private String getContexts()
+	{
+		StringBuilder sb = new StringBuilder();
+		for ( Handler handler : server.getChildHandlersByClass( CellHandler.class ) )
 		{
 			CellHandler contextHandler = null;
 			if ( handler instanceof CellHandler )
 			{
+				sb.append( "<tr>\n<th>" );
 				contextHandler = ( CellHandler ) handler;
-				ow.write( contextHandler.getContextPath() + "<BR/>" );
+				sb.append( contextHandler.getContextPath() + "</th>\n<td>" );
+				sb.append( contextHandler.getXmlFile() + "</td>\n</tr>\n" );
 			}
 		}
-
-		ow.write( statHandler.toStatsHTML() );
-
-		ow.write( "</BODY>" );
-		ow.close();
+		return sb.toString();
 	}
 
 	private void deploy( final String datasetName, final String fileLocation, final Request baseRequest, final HttpServletResponse response ) throws IOException
diff --git a/src/main/resources/templates/manager.st b/src/main/resources/templates/manager.st
new file mode 100644
index 0000000000000000000000000000000000000000..38ab1b4b2f3ba57d64089ac92ad6ed510234030f
--- /dev/null
+++ b/src/main/resources/templates/manager.st
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+    <meta http-equiv="refresh" content="5"/>
+
+    <title>BigDataServer</title>
+
+    <!-- Latest compiled and minified CSS -->
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
+
+    <!-- Optional theme -->
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap-theme.min.css">
+
+    <!-- Latest compiled and minified JavaScript -->
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
+</head>
+
+<body class="tundra">
+
+This page is refreshed in every 5 secs.<br/>
+
+<div class="contentelement">
+
+    <h1>$title$</h1>
+
+    <hr>
+
+    <table cellspacing="2">
+        <tr>
+            <th>Bytes sent total:</th>
+            <td>$bytesSent$</td>
+        </tr>
+        <tr>
+            <th>Messages per second:</th>
+            <td>$msgPerSec$</td>
+        </tr>
+        <tr>
+            <th>Open connections:</th>
+            <td>$openConnections$</td>
+        </tr>
+        <tr>
+            <th>Max open connections:</th>
+            <td>$maxOpenConnections$</td>
+        </tr>
+    </table>
+
+    <hr>
+
+    <h1> Datasets: </h1>
+    <table cellspacing="2">
+        $contexts$
+    </table>
+
+    <hr>
+    <table cellspacing="2">
+        <tr>
+            <td>
+                $statHtml$
+            </td>
+        </tr>
+    </table>
+
+</div>
+</body>
+</html>
\ No newline at end of file