diff --git a/src/main/java/viewer/render/labelling/LabelingSource.java b/src/main/java/viewer/render/labelling/LabelingSource.java
index de92f2c5360c91656173fc0b36fdcd3ab16b2e42..c9b5d28c566a234a0a70012559da2987ae67590a 100644
--- a/src/main/java/viewer/render/labelling/LabelingSource.java
+++ b/src/main/java/viewer/render/labelling/LabelingSource.java
@@ -35,16 +35,17 @@ import viewer.render.Source;
  * @author Stephan Preibisch
  * 
  */
-public class LabelingSource implements Source<ARGBType> {
+public class LabelingSource< T > implements Source< ARGBType >
+{
 	private int currentTimepoint;
 
-	private NativeImgLabeling<Integer, IntType> currentSource;
+	private NativeImgLabeling< Integer, IntType > currentSource;
 
-	private final Source<?> imgSource;
+	private final Source< T > imgSource;
 
 	private final String name;
 
-	private final LabelingTypeARGBConverter<Integer> converter;
+	private final LabelingTypeARGBConverter< Integer > converter;
 
 	final protected static int numInterpolationMethods = 2;
 
@@ -52,7 +53,7 @@ public class LabelingSource implements Source<ARGBType> {
 
 	final protected static int iNLinearMethod = 1;
 
-	final protected InterpolatorFactory<ARGBType, RandomAccessible<ARGBType>>[] interpolatorFactories;
+	final protected InterpolatorFactory< ARGBType, RandomAccessible< ARGBType >>[] interpolatorFactories;
 
 	private volatile int oldAlpha = -1;
 
@@ -62,94 +63,146 @@ public class LabelingSource implements Source<ARGBType> {
 	 * The map that stores the labeling for each time point. Its values are all
 	 * <code>null</code> until the target time-point is initialized.
 	 */
-	private final Map<Integer, NativeImgLabeling<Integer, IntType>> labelings;
+	private final Map< Integer, NativeImgLabeling< Integer, IntType >> labelings;
 
 	private final AffineTransform3D currentTranform = new AffineTransform3D();
 
-	@SuppressWarnings("unchecked")
-	public LabelingSource(final Source<?> imgSource) {
+	private final int level;
+
+	@SuppressWarnings( "unchecked" )
+	public LabelingSource( final Source< T > imgSource, final int level )
+	{
 		this.imgSource = imgSource;
+		this.level = level;
 		name = imgSource.getName() + " annotations";
-		converter = new LabelingTypeARGBConverter<Integer>(new HashMap<List<Integer>, ARGBType>());
-		interpolatorFactories = new InterpolatorFactory[numInterpolationMethods];
-		interpolatorFactories[iNearestNeighborMethod] = new NearestNeighborInterpolatorFactory<ARGBType>();
-		interpolatorFactories[iNLinearMethod] = new NLinearInterpolatorFactory<ARGBType>();
+		converter = new LabelingTypeARGBConverter< Integer >( new HashMap< List< Integer >, ARGBType >() );
+		interpolatorFactories = new InterpolatorFactory[ numInterpolationMethods ];
+		interpolatorFactories[ iNearestNeighborMethod ] = new NearestNeighborInterpolatorFactory< ARGBType >();
+		interpolatorFactories[ iNLinearMethod ] = new NLinearInterpolatorFactory< ARGBType >();
+
+		labelings = new HashMap< Integer, NativeImgLabeling< Integer, IntType >>();
 
-		labelings = new HashMap<Integer, NativeImgLabeling<Integer, IntType>>();
+		loadTimepoint( 0 );
+	}
 
-		loadTimepoint(0);
+	public LabelingSource( final Source< T > imgSource )
+	{
+		this( imgSource, 0 );
 	}
 
 	@Override
-	public boolean isPresent(final int t) {
-		return imgSource.isPresent(t);
+	public boolean isPresent( final int t )
+	{
+		return imgSource.isPresent( t );
 	}
 
 	@Override
-	public RandomAccessibleInterval<ARGBType> getSource(final int t, final int level) {
-		if (t != currentTimepoint)
-			loadTimepoint(t);
-		if (currentAlpha != oldAlpha)
+	public RandomAccessibleInterval< ARGBType > getSource( final int t, final int level )
+	{
+		if ( t != currentTimepoint )
+		{
+			loadTimepoint( t );
+		}
+		if ( currentAlpha != oldAlpha )
+		{
 			updateColorTable();
-		return Converters.convert((RandomAccessibleInterval<LabelingType<Integer>>) currentSource, converter, new ARGBType());
+		}
+		return Converters.convert( ( RandomAccessibleInterval< LabelingType< Integer >> ) currentSource, converter, new ARGBType() );
 	}
 
 	@Override
-	public RealRandomAccessible<ARGBType> getInterpolatedSource(final int t, final int level, final Interpolation method) {
-		return Views.interpolate(Views.extendValue(getSource(t, level), new ARGBType()), interpolatorFactories[method == Interpolation.NLINEAR ? iNLinearMethod : iNearestNeighborMethod]);
+	public RealRandomAccessible< ARGBType > getInterpolatedSource( final int t, final int level, final Interpolation method )
+	{
+		return Views.interpolate( Views.extendValue( getSource( t, level ), new ARGBType() ), interpolatorFactories[ method == Interpolation.NLINEAR ? iNLinearMethod : iNearestNeighborMethod ] );
 	}
 
 	@Override
-	public int getNumMipmapLevels() {
+	public int getNumMipmapLevels()
+	{
 		return 1;
 	}
 
-	private void loadTimepoint(final int timepoint) {
+	/**
+	 * Returns the mipmap level of the img source this labeling is built upon.
+	 * 
+	 * @return the mipmap level.
+	 */
+	public int getLevel()
+	{
+		return level;
+	}
+
+	/**
+	 * Exposes the {@link Source} this labeling source is built on.
+	 * 
+	 * @return a {@link Source}.
+	 */
+	public Source< T > getImgSource()
+	{
+		return imgSource;
+	}
+
+	private void loadTimepoint( final int timepoint )
+	{
 		currentTimepoint = timepoint;
-		if (isPresent(timepoint)) {
+		if ( isPresent( timepoint ) )
+		{
 
-			currentTranform.set(imgSource.getSourceTransform(timepoint, 0));
+			currentTranform.set( imgSource.getSourceTransform( timepoint, level ) );
 
-			NativeImgLabeling<Integer, IntType> labeling = labelings.get(Integer.valueOf(timepoint));
-			if (null == labeling) {
-				final Dimensions sourceDimensions = imgSource.getSource(timepoint, 0);
-				labeling = newLabeling(sourceDimensions);
-				labelings.put(Integer.valueOf(timepoint), labeling);
+			NativeImgLabeling< Integer, IntType > labeling = labelings.get( Integer.valueOf( timepoint ) );
+			if ( null == labeling )
+			{
+				final Dimensions sourceDimensions = imgSource.getSource( timepoint, level );
+				labeling = newLabeling( sourceDimensions );
+				labelings.put( Integer.valueOf( timepoint ), labeling );
 			}
 			currentSource = labeling;
 			updateColorTable();
-		} else
+		}
+		else
+		{
 			currentSource = null;
+		}
 	}
 
 	@Override
-	public AffineTransform3D getSourceTransform(final int t, final int level) {
-		if (currentTimepoint != t) {
-			loadTimepoint(t);
+	public AffineTransform3D getSourceTransform( final int t, final int level )
+	{
+		if ( currentTimepoint != t )
+		{
+			loadTimepoint( t );
 		}
 		return currentTranform;
 	}
 
 	@Override
-	public ARGBType getType() {
+	public ARGBType getType()
+	{
 		return new ARGBType();
 	}
 
 	@Override
-	public String getName() {
+	public String getName()
+	{
 		return name;
 	}
 
-	public NativeImgLabeling<Integer, IntType> getLabeling(final int t) {
-		NativeImgLabeling<Integer, IntType> target;
-		if (isPresent(t)) {
-			target = labelings.get(Integer.valueOf(t));
-			if (null == target) {
-				final Dimensions sourceDimensions = imgSource.getSource(t, 0);
-				target = newLabeling(sourceDimensions);
-				labelings.put(Integer.valueOf(t), target);
+	public NativeImgLabeling< Integer, IntType > getLabeling( final int t )
+	{
+		NativeImgLabeling< Integer, IntType > target;
+		if ( isPresent( t ) )
+		{
+			target = labelings.get( Integer.valueOf( t ) );
+			if ( null == target )
+			{
+				final Dimensions sourceDimensions = imgSource.getSource( t, level );
+				target = newLabeling( sourceDimensions );
+				labelings.put( Integer.valueOf( t ), target );
 			}
-		} else {
+		}
+		else
+		{
 			target = null;
 		}
 		return target;
@@ -161,7 +214,8 @@ public class LabelingSource implements Source<ARGBType> {
 	 * @param alpha
 	 *            an <code>int</code>, ranging from 0 to 255.
 	 */
-	public void setAlpha(final int alpha) {
+	public void setAlpha( final int alpha )
+	{
 		this.currentAlpha = alpha;
 	}
 
@@ -170,32 +224,36 @@ public class LabelingSource implements Source<ARGBType> {
 	 * 
 	 * @return an <code>int</code>, ranging from 0 to 255.
 	 */
-	public int getAlpha() {
+	public int getAlpha()
+	{
 		return currentAlpha;
 	}
 
-	public void updateColorTable() {
+	public void updateColorTable()
+	{
 		final int a = currentAlpha;
-		final HashMap<List<Integer>, ARGBType> colorTable = new HashMap<List<Integer>, ARGBType>();
-		final LabelingMapping<Integer> mapping = currentSource.getMapping();
+		final HashMap< List< Integer >, ARGBType > colorTable = new HashMap< List< Integer >, ARGBType >();
+		final LabelingMapping< Integer > mapping = currentSource.getMapping();
 		final int numLists = mapping.numLists();
-		final Random random = new Random(1);
-		for (int i = 0; i < numLists; ++i) {
-			final List<Integer> list = mapping.listAtIndex(i);
-			final int r = random.nextInt(256);
-			final int g = random.nextInt(256);
-			final int b = random.nextInt(256);
-			colorTable.put(list, new ARGBType(ARGBType.rgba(r, g, b, a)));
+		final Random random = new Random( 1 );
+		for ( int i = 0; i < numLists; ++i )
+		{
+			final List< Integer > list = mapping.listAtIndex( i );
+			final int r = random.nextInt( 256 );
+			final int g = random.nextInt( 256 );
+			final int b = random.nextInt( 256 );
+			colorTable.put( list, new ARGBType( ARGBType.rgba( r, g, b, a ) ) );
 		}
-		colorTable.put(mapping.emptyList(), new ARGBType(0));
-		converter.setColorTable(colorTable);
+		colorTable.put( mapping.emptyList(), new ARGBType( 0 ) );
+		converter.setColorTable( colorTable );
 		oldAlpha = a;
 	}
 
-	private static final NativeImgLabeling<Integer, IntType> newLabeling(final Dimensions dimensions) {
-		final NtreeImgFactory<IntType> factory = new NtreeImgFactory<IntType>();
-		final Img<IntType> img = factory.create(dimensions, new IntType());
-		final NativeImgLabeling<Integer, IntType> labeling = new NativeImgLabeling<Integer, IntType>(img);
+	private static final NativeImgLabeling< Integer, IntType > newLabeling( final Dimensions dimensions )
+	{
+		final NtreeImgFactory< IntType > factory = new NtreeImgFactory< IntType >();
+		final Img< IntType > img = factory.create( dimensions, new IntType() );
+		final NativeImgLabeling< Integer, IntType > labeling = new NativeImgLabeling< Integer, IntType >( img );
 		return labeling;
 	}