diff --git a/src/main/java/bdv/server/CellHandler.java b/src/main/java/bdv/server/CellHandler.java
index c1e71e25ba3c2d4003f4f6ef3cf3eaa88257e9b0..a320ef147d134a78462b30549ae9d94bfabb85e9 100644
--- a/src/main/java/bdv/server/CellHandler.java
+++ b/src/main/java/bdv/server/CellHandler.java
@@ -3,14 +3,8 @@ package bdv.server;
 import azgracompress.cache.ICacheFile;
 import azgracompress.cache.QuantizationCacheManager;
 import azgracompress.compression.CompressionOptions;
-import azgracompress.compression.IImageCompressor;
 import azgracompress.compression.ImageCompressor;
-import azgracompress.data.V3;
-import azgracompress.data.V3i;
 import azgracompress.io.FileInputData;
-import azgracompress.io.FlatBufferInputData;
-import azgracompress.io.InputData;
-import azgracompress.quantization.vector.VQCodebook;
 import bdv.BigDataViewer;
 import bdv.cache.CacheHints;
 import bdv.cache.LoadingStrategy;
@@ -149,6 +143,27 @@ public class CellHandler extends ContextHandler {
         }
     }
 
+    private short[] getCachedVolatileCellData(final String[] parts, final int[] cellDims) {
+        final int index = Integer.parseInt(parts[1]);
+        final int timepoint = Integer.parseInt(parts[2]);
+        final int setup = Integer.parseInt(parts[3]);
+        final int level = Integer.parseInt(parts[4]);
+        final Key key = new VolatileGlobalCellCache.Key(timepoint, setup, level, index);
+        VolatileCell<?> cell = cache.getLoadingVolatileCache().getIfPresent(key, cacheHints);
+
+        final long[] cellMin = new long[]{
+                Long.parseLong(parts[8]),
+                Long.parseLong(parts[9]),
+                Long.parseLong(parts[10])};
+        if (cell == null) {
+            cell = cache.getLoadingVolatileCache().get(key,
+                                                       cacheHints,
+                                                       new VolatileCellLoader<>(loader, timepoint, setup, level, cellDims, cellMin));
+        }
+        //noinspection unchecked
+        return ((VolatileCell<VolatileShortArray>) cell).getData().getCurrentStorageArray();
+    }
+
     @Override
     public void doHandle(final String target,
                          final Request baseRequest,
@@ -171,63 +186,52 @@ public class CellHandler extends ContextHandler {
             respondWithString(baseRequest, response, "application/xml", datasetXmlString);
             return;
         }
-
         final String[] parts = cellString.split("/");
         if (parts[0].equals("cell")) {
-            final int index = Integer.parseInt(parts[1]);
-            final int timepoint = Integer.parseInt(parts[2]);
-            final int setup = Integer.parseInt(parts[3]);
-            final int level = Integer.parseInt(parts[4]);
-            final Key key = new VolatileGlobalCellCache.Key(timepoint, setup, level, index);
-            VolatileCell<?> cell = cache.getLoadingVolatileCache().getIfPresent(key, cacheHints);
 
             final int[] cellDims = new int[]{
                     Integer.parseInt(parts[5]),
                     Integer.parseInt(parts[6]),
                     Integer.parseInt(parts[7])};
 
-            final long[] cellMin = new long[]{
-                    Long.parseLong(parts[8]),
-                    Long.parseLong(parts[9]),
-                    Long.parseLong(parts[10])};
-            if (cell == null) {
-                cell = cache.getLoadingVolatileCache().get(key,
-                                                           cacheHints,
-                                                           new VolatileCellLoader<>(loader,
-                                                                                    timepoint,
-                                                                                    setup,
-                                                                                    level,
-                                                                                    cellDims,
-                                                                                    cellMin));
+            final short[] data = getCachedVolatileCellData(parts, cellDims);
+
+            final OutputStream responseStream = response.getOutputStream();
+
+            final byte[] buf = new byte[2 * data.length];
+            for (int i = 0, j = 0; i < data.length; i++) {
+                final short s = data[i];
+                buf[j++] = (byte) ((s >> 8) & 0xff);
+                buf[j++] = (byte) (s & 0xff);
             }
+            response.setContentLength(buf.length);
+            responseStream.write(buf);
 
+            responseStream.close();
 
-            @SuppressWarnings("unchecked")
-            short[] data = ((VolatileCell<VolatileShortArray>) cell).getData().getCurrentStorageArray();
+            response.setContentType("application/octet-stream");
+            response.setStatus(HttpServletResponse.SC_OK);
+            baseRequest.setHandled(true);
+
+        } else if (parts[0].equals("cell_qcmp")) {
+            final int[] cellDims = new int[]{Integer.parseInt(parts[5]), Integer.parseInt(parts[6]), Integer.parseInt(parts[7])};
 
+            final short[] data = getCachedVolatileCellData(parts, cellDims);
             final OutputStream responseStream = response.getOutputStream();
-            if (compressor == null || true) {
-                final byte[] buf = new byte[2 * data.length];
-                for (int i = 0, j = 0; i < data.length; i++) {
-                    final short s = data[i];
-                    buf[j++] = (byte) ((s >> 8) & 0xff);
-                    buf[j++] = (byte) (s & 0xff);
-                }
-                response.setContentLength(buf.length);
-                responseStream.write(buf);
-            } else {
-                // TODO(Moravec): Implement.
-            }
+            assert (compressor != null);
+
+            final int contentLength = compressor.streamCompress(responseStream);
             responseStream.close();
+            response.setContentLength(contentLength);
 
             response.setContentType("application/octet-stream");
             response.setStatus(HttpServletResponse.SC_OK);
             baseRequest.setHandled(true);
-
         } else if (parts[0].equals("init")) {
             respondWithString(baseRequest, response, "application/json", metadataJson);
         } else if (parts[0].equals("init_qcmp")) {
             if (compressor == null) {
+                LOG.info("QCMP initialization request was refused, QCMP compression is not enabled.");
                 respondWithString(baseRequest, response,
                                   "text/plain", "QCMP Compression wasn't enabled on BigDataViewer server.",
                                   HttpServletResponse.SC_BAD_REQUEST);