diff --git a/pom.xml b/pom.xml
index e3030786d2545b2da4339b1178b7440ba21fb635..2777d034dcaf70267af09e5a0e004c164ce0abf4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,30 +5,40 @@
 	<parent>
 		<groupId>sc.fiji</groupId>
 		<artifactId>pom-bigdataviewer</artifactId>
-		<version>2.2.0</version>
+		<version>4.0.1</version>
 	</parent>
 
 	<artifactId>bigdataviewer-server</artifactId>
-	<version>2.0.1-SNAPSHOT</version>
+	<version>2.1.0-SNAPSHOT</version>
 
 	<name>BigDataServer</name>
 	<description>A web server for BigDataViewer datasets</description>
 
+	<scm>
+		<connection>scm:git:git://github.com/bigdataviewer/bigdataviewer-server</connection>
+		<developerConnection>scm:git:git@github.com:bigdataviewer/bigdataviewer-server</developerConnection>
+		<tag>HEAD</tag>
+		<url>https://github.com/bigdataviewer/bigdataviewer-server</url>
+	</scm>
+	<issueManagement>
+		<system>GitHub Issues</system>
+		<url>https://github.com/bigdataviewer/bigdataviewer-server/issues</url>
+	</issueManagement>
+	<ciManagement>
+		<system>Jenkins</system>
+		<url>http://jenkins.imagej.net/job/bigdataviewer-server/</url>
+	</ciManagement>
+
 	<properties>
-		<scijava.jvm.version>1.7</scijava.jvm.version>
+		<enforcer.skip>true</enforcer.skip>
 	</properties>
 
-	<build>
-		<plugins>
-			<plugin>
-				<artifactId>maven-compiler-plugin</artifactId>
-				<configuration>
-					<source>1.7</source>
-					<target>1.7</target>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
+	<repositories>
+		<repository>
+			<id>imagej.public</id>
+			<url>http://maven.imagej.net/content/groups/public</url>
+		</repository>
+	</repositories>
 
 	<dependencies>
 		<dependency>
@@ -55,29 +65,23 @@
 		<developer>
 			<id>tpietzsch</id>
 			<name>Tobias Pietzsch</name>
-			<email>pietzsch@mpi-cbg.de</email>
-			<url />
-			<organization>MPI-CBG</organization>
-			<organizationUrl>http://www.mpi-cbg.de/</organizationUrl>
+			<url>http://imagej.net/User:Pietzsch</url>
 			<roles>
-				<role>architect</role>
+				<role>founder</role>
+				<role>lead</role>
 				<role>developer</role>
+				<role>debugger</role>
+				<role>reviewer</role>
+				<role>support</role>
+				<role>maintainer</role>
 			</roles>
-			<timezone>+1</timezone>
 		</developer>
 	</developers>
-
-	<repositories>
-		<repository>
-			<id>imagej.public</id>
-			<url>http://maven.imagej.net/content/groups/public</url>
-		</repository>
-	</repositories>
-
-	<scm>
-		<connection>scm:git:git://github.com/tpietzsch/spimviewer</connection>
-		<developerConnection>scm:git:git@github.com:tpietzsch/spimviewer</developerConnection>
-		<tag>HEAD</tag>
-		<url>https://github.com/tpietzsch/spimviewer</url>
-	</scm>
+	<contributors>
+		<contributor>
+			<name>HongKee Moon</name>
+			<url>http://imagej.net/User:Moon</url>
+			<properties><id>hkmoon</id></properties>
+		</contributor>
+	</contributors>
 </project>
diff --git a/src/main/java/bdv/server/CellHandler.java b/src/main/java/bdv/server/CellHandler.java
index 5d6712ca33e74305f8cdea685adbb3904fa3a237..1cb8682b2b339e9bfbf79896e1582f7c478cab24 100644
--- a/src/main/java/bdv/server/CellHandler.java
+++ b/src/main/java/bdv/server/CellHandler.java
@@ -14,10 +14,6 @@ import javax.imageio.ImageIO;
 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.eclipse.jetty.util.log.Log;
@@ -27,11 +23,15 @@ import org.jdom2.input.SAXBuilder;
 import org.jdom2.output.Format;
 import org.jdom2.output.XMLOutputter;
 
+import com.google.gson.GsonBuilder;
+
 import bdv.BigDataViewer;
-import bdv.img.cache.CacheHints;
-import bdv.img.cache.LoadingStrategy;
+import bdv.cache.CacheHints;
+import bdv.cache.LoadingStrategy;
 import bdv.img.cache.VolatileCell;
 import bdv.img.cache.VolatileGlobalCellCache;
+import bdv.img.cache.VolatileGlobalCellCache.Key;
+import bdv.img.cache.VolatileGlobalCellCache.VolatileCellLoader;
 import bdv.img.hdf5.Hdf5ImageLoader;
 import bdv.img.hdf5.Hdf5VolatileShortArrayLoader;
 import bdv.img.remote.AffineTransform3DJsonSerializer;
@@ -41,8 +41,9 @@ import bdv.spimdata.SequenceDescriptionMinimal;
 import bdv.spimdata.SpimDataMinimal;
 import bdv.spimdata.XmlIoSpimDataMinimal;
 import bdv.util.ThumbnailGenerator;
-
-import com.google.gson.GsonBuilder;
+import mpicbg.spim.data.SpimDataException;
+import net.imglib2.img.basictypeaccess.volatiles.array.VolatileShortArray;
+import net.imglib2.realtransform.AffineTransform3D;
 
 public class CellHandler extends ContextHandler
 {
@@ -97,7 +98,7 @@ public class CellHandler extends ContextHandler
 		final SequenceDescriptionMinimal seq = spimData.getSequenceDescription();
 		final Hdf5ImageLoader imgLoader = ( Hdf5ImageLoader ) seq.getImgLoader();
 
-		cache = imgLoader.getCache();
+		cache = imgLoader.getCacheControl();
 		loader = imgLoader.getShortArrayLoader();
 		cacheHints = new CacheHints( LoadingStrategy.BLOCKING, 0, false );
 
@@ -144,7 +145,8 @@ public class CellHandler extends ContextHandler
 			final int timepoint = Integer.parseInt( parts[ 2 ] );
 			final int setup = Integer.parseInt( parts[ 3 ] );
 			final int level = Integer.parseInt( parts[ 4 ] );
-			VolatileCell< ? > cell = cache.getGlobalIfCached( timepoint, setup, level, index, cacheHints );
+			final Key key = new VolatileGlobalCellCache.Key( timepoint, setup, level, index );
+			VolatileCell< ? > cell = cache.getLoadingVolatileCache().getIfPresent( key, cacheHints );
 			if ( cell == null )
 			{
 				final int[] cellDims = new int[] {
@@ -155,7 +157,7 @@ public class CellHandler extends ContextHandler
 						Long.parseLong( parts[ 8 ] ),
 						Long.parseLong( parts[ 9 ] ),
 						Long.parseLong( parts[ 10 ] ) };
-				cell = cache.createGlobal( cellDims, cellMin, timepoint, setup, level, index, cacheHints, loader );
+				cell = cache.getLoadingVolatileCache().get( key, cacheHints, new VolatileCellLoader<>( loader, timepoint, setup, level, cellDims, cellMin ) );
 			}
 
 			@SuppressWarnings( "unchecked" )
diff --git a/src/main/java/bdv/server/ManagerHandler.java b/src/main/java/bdv/server/ManagerHandler.java
index de9a1d8b6bcca25c58a09bbef2690d78d2fda43c..d806e4de77aaa1e17d0da5834225d60973b58869 100644
--- a/src/main/java/bdv/server/ManagerHandler.java
+++ b/src/main/java/bdv/server/ManagerHandler.java
@@ -87,10 +87,6 @@ public class ManagerHandler extends ContextHandler
 			final String ds = request.getParameter( "ds" );
 			undeploy( ds, baseRequest, response );
 		}
-		else
-		{
-			return;
-		}
 	}
 
 	public String getByteSizeString( final long size )
diff --git a/src/main/java/bdv/util/ThumbnailGenerator.java b/src/main/java/bdv/util/ThumbnailGenerator.java
index 64c78f785e4f6761ead77c4e0ab2c9bf68041a26..92c0f322bce7e29f9406fd1d063dba49b65e25f5 100644
--- a/src/main/java/bdv/util/ThumbnailGenerator.java
+++ b/src/main/java/bdv/util/ThumbnailGenerator.java
@@ -7,16 +7,12 @@ import java.util.List;
 
 import javax.imageio.ImageIO;
 
-import net.imglib2.realtransform.AffineTransform3D;
-import net.imglib2.ui.PainterThread;
-import net.imglib2.ui.RenderTarget;
-
 import org.jdom2.Document;
 import org.jdom2.Element;
 import org.jdom2.input.SAXBuilder;
 
 import bdv.BigDataViewer;
-import bdv.img.cache.Cache;
+import bdv.cache.CacheControl;
 import bdv.spimdata.SpimDataMinimal;
 import bdv.spimdata.XmlIoSpimDataMinimal;
 import bdv.tools.InitializeViewerState;
@@ -32,6 +28,9 @@ import bdv.viewer.state.SourceGroup;
 import bdv.viewer.state.SourceState;
 import bdv.viewer.state.ViewerState;
 import bdv.viewer.state.XmlIoViewerState;
+import net.imglib2.realtransform.AffineTransform3D;
+import net.imglib2.ui.PainterThread;
+import net.imglib2.ui.RenderTarget;
 
 /**
  * Created by moon on 2/5/15.
@@ -94,7 +93,7 @@ public class ThumbnailGenerator
 			}
 		}
 		final ThumbnailTarget renderTarget = new ThumbnailTarget();
-		new MultiResolutionRenderer( renderTarget, new PainterThread( null ), new double[] { 1 }, 0, false, 1, null, false, AccumulateProjectorARGB.factory, new Cache.Dummy() ).paint( state );
+		new MultiResolutionRenderer( renderTarget, new PainterThread( null ), new double[] { 1 }, 0, false, 1, null, false, AccumulateProjectorARGB.factory, new CacheControl.Dummy() ).paint( state );
 		return renderTarget.bi;
 	}