diff --git a/src/main/java/bdv/BigDataViewer.java b/src/main/java/bdv/BigDataViewer.java
index 48b0c8f75ffd483f49036c3323af0e3af85dcb35..c83bd20ff02dcd6936121c10a33139ae9ead2f83 100644
--- a/src/main/java/bdv/BigDataViewer.java
+++ b/src/main/java/bdv/BigDataViewer.java
@@ -380,7 +380,8 @@ public class BigDataViewer
 
 	public static void main( final String[] args )
 	{
-		final String fn = "/Users/pietzsch/desktop/data/catmaid-confocal.xml";
+//		final String fn = "/Users/pietzsch/desktop/data/catmaid-confocal.xml";
+		final String fn = "/home/saalfeld/catmaid-confocal.xml";
 //		final String fn = "/Users/pietzsch/desktop/data/BDV130418A325/BDV130418A325_NoTempReg.xml";
 //		final String fn = "/Users/pietzsch/Desktop/data/valia2/valia.xml";
 //		final String fn = "/Users/pietzsch/workspace/data/fast fly/111010_weber/combined.xml";
diff --git a/src/main/java/bdv/img/catmaid/CatmaidImageLoader.java b/src/main/java/bdv/img/catmaid/CatmaidImageLoader.java
index b64a15b354766d34cca1c90dda9460cf856c2056..d8c12d39f6068135bbc0f652f856a181a0a2dd60 100644
--- a/src/main/java/bdv/img/catmaid/CatmaidImageLoader.java
+++ b/src/main/java/bdv/img/catmaid/CatmaidImageLoader.java
@@ -84,7 +84,7 @@ public class CatmaidImageLoader implements ViewerImgLoader< ARGBType, VolatileAR
 
 		final int[] maxLevels = new int[] { numScales - 1 };
 		cache = new VolatileGlobalCellCache< VolatileIntArray >(
-				new CatmaidVolatileIntArrayLoader( baseUrl, tileWidth, tileHeight ), 1, 1, numScales, maxLevels, 10 );
+				new CatmaidVolatileIntArrayLoader( baseUrl + "%5$d/%8$d_%9$d_%1$d.jpg", tileWidth, tileHeight ), 1, 1, numScales, maxLevels, 10 );
 	}
 
 	final static public int getNumScales( long width, long height, final long tileWidth, final long tileHeight )
diff --git a/src/main/java/bdv/img/catmaid/CatmaidVolatileIntArrayLoader.java b/src/main/java/bdv/img/catmaid/CatmaidVolatileIntArrayLoader.java
index ebfe9e00359becc2cfc3e4c62f12a19b384dc398..c9dba0152173148ef56b7141486c0b71eda478d2 100644
--- a/src/main/java/bdv/img/catmaid/CatmaidVolatileIntArrayLoader.java
+++ b/src/main/java/bdv/img/catmaid/CatmaidVolatileIntArrayLoader.java
@@ -14,20 +14,50 @@ public class CatmaidVolatileIntArrayLoader implements CacheArrayLoader< Volatile
 {
 	private VolatileIntArray theEmptyArray;
 
-	private final String baseUrl;
-
+	private final String urlFormat;
+	
 	private final int tileWidth;
 
 	private final int tileHeight;
 
-	public CatmaidVolatileIntArrayLoader( final String baseUrl, final int tileWidth, final int tileHeight )
+	/**
+	 * <p>Create a {@link CacheArrayLoader} for a CATMAID source.  Tiles are
+	 * addressed, in this order, by their</p>
+	 * <ul>
+	 * <li>scale level,</li>
+	 * <li>scale,</li>
+	 * <li>x,</li>
+	 * <li>y,</li>
+	 * <li>z,</li>
+	 * <li>tile width,</li>
+	 * <li>tile height,</li>
+	 * <li>tile row, and</li>
+	 * <li>tile column.</li>
+	 * </ul>
+	 * <p><code>urlFormat</code> specifies how these parameters are used
+	 * to generate a URL referencing the tile.  Examples:</p>
+	 *
+	 * <dl>
+	 * <dt>"http://catmaid.org/my-data/xy/%5$d/%8$d_%9$d_%1$d.jpg"</dt>
+	 * <dd>CATMAID DefaultTileSource (type 1)</dd>
+	 * <dt>"http://catmaid.org/my-data/xy/?x=%3$d&y=%4$d&width=%6d&height=%7$d&row=%8$d&col=%9$d&scale=%2$f&z=%4$d"</dt>
+     * <dd>CATMAID RequestTileSource (type 2)</dd>
+	 * <dt>"http://catmaid.org/my-data/xy/%1$d/%5$d/%8$d/%9$d.jpg"</dt>
+	 * <dd>CATMAID LargeDataTileSource (type 5)</dd>
+	 * </dl>
+	 * 
+	 * @param urlFormat
+	 * @param tileWidth
+	 * @param tileHeight
+	 */
+	public CatmaidVolatileIntArrayLoader( final String urlFormat, final int tileWidth, final int tileHeight )
 	{
-		theEmptyArray = new VolatileIntArray( 256 * 256, false );
-		this.baseUrl = baseUrl;
+		theEmptyArray = new VolatileIntArray( tileWidth * tileHeight, false );
+		this.urlFormat = urlFormat;
 		this.tileWidth = tileWidth;
 		this.tileHeight = tileHeight;
 	}
-
+	
 	@Override
 	public int getBytesPerElement()
 	{
@@ -35,24 +65,19 @@ public class CatmaidVolatileIntArrayLoader implements CacheArrayLoader< Volatile
 	}
 
 	@Override
-	public VolatileIntArray loadArray( final int timepoint, final int setup, final int level, final int[] dimensions, final long[] min ) throws InterruptedException
+	public VolatileIntArray loadArray(
+			final int timepoint,
+			final int setup,
+			final int level,
+			final int[] dimensions,
+			final long[] min ) throws InterruptedException
 	{
 		final int c = ( int ) min[ 0 ] / tileWidth;
 		final int r = ( int ) min[ 1 ] / tileHeight;
-		final int z = ( int ) min[ 2 ];
-		final int s = level;
-		final String urlString =
-				new
-					StringBuffer( baseUrl ).
-					append( z ).
-					append( "/" ).
-					append( r ).
-					append( "_" ).
-					append( c ).
-					append( "_" ).
-					append( s ).
-					append( ".jpg" ).
-					toString();
+		final double scale = 1.0 / Math.pow(2.0, level);
+		
+		final String urlString = String.format( urlFormat, level, scale, min[ 0 ], min[ 1 ], min[ 2 ], tileWidth, tileHeight, r, c );
+		
 		final int w = dimensions[ 0 ];
 		final int h = dimensions[ 1 ];
 		final int[] data = new int[ w * h ];