diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/AbsoluteImageReference.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/AbsoluteImageReference.java
index 0a2e1eb7e820999bb9af6544b37346af91c9df2b..0e504f5cd824656f7a71ea8baf80bf861ae2de2b 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/AbsoluteImageReference.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/AbsoluteImageReference.java
@@ -48,6 +48,8 @@ public class AbsoluteImageReference extends AbstractImageReference
 
     private ChannelColorRGB channelColor;
 
+    private String singleChannelTransformationCodeOrNull;
+
     /**
      * @param contentNode is the original content before choosing the color component and the image
      *            ID
@@ -56,7 +58,7 @@ public class AbsoluteImageReference extends AbstractImageReference
             String imageIdOrNull, ColorComponent colorComponentOrNull,
             RequestedImageSize imageSize, ChannelColorRGB channelColor,
             ImageTransfomationFactories imageTransfomationFactories,
-            ImageLibraryInfo imageLibraryOrNull)
+            ImageLibraryInfo imageLibraryOrNull, String singleChannelTransformationCodeOrNull)
     {
         super(imageIdOrNull, colorComponentOrNull);
         assert imageSize != null : "image size is null";
@@ -68,6 +70,7 @@ public class AbsoluteImageReference extends AbstractImageReference
         this.channelColor = channelColor;
         this.imageTransfomationFactories = imageTransfomationFactories;
         this.imageLibraryOrNull = imageLibraryOrNull;
+        this.singleChannelTransformationCodeOrNull = singleChannelTransformationCodeOrNull;
     }
 
     /**
@@ -104,10 +107,10 @@ public class AbsoluteImageReference extends AbstractImageReference
         }
         return image;
     }
-    
+
     /**
-     * Returns the image size. Preferred method if only image size is needed because only the
-     * header of an image file might be read to get the size.
+     * Returns the image size. Preferred method if only image size is needed because only the header
+     * of an image file might be read to get the size.
      */
     public Size getUnchangedImageSize()
     {
@@ -133,11 +136,16 @@ public class AbsoluteImageReference extends AbstractImageReference
         return channelColor;
     }
 
+    public String tryGetSingleChannelTransformationCode()
+    {
+        return singleChannelTransformationCodeOrNull;
+    }
+
     public AbsoluteImageReference createWithoutColorComponent()
     {
         ColorComponent colorComponent = null;
         return new AbsoluteImageReference(contentNode, uniqueId, tryGetImageID(), colorComponent,
-                imageSize, channelColor, imageTransfomationFactories, imageLibraryOrNull);
-
+                imageSize, channelColor, imageTransfomationFactories, imageLibraryOrNull,
+                singleChannelTransformationCodeOrNull);
     }
 }
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/IImagingDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/IImagingDatasetLoader.java
index 637641bf03caec39cf50925a98f19003d133af11..b5eff24ee1cb81dec96afbbc96bb01c6f187bcd0 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/IImagingDatasetLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/IImagingDatasetLoader.java
@@ -30,15 +30,17 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.IImageDatasetLoa
 public interface IImagingDatasetLoader extends IImageDatasetLoader
 {
     /**
-     * @param channelCode The code fo the channel to get the image for
+     * @param channelCode The code for the channel to get the image for
      * @param imageSize required image size, specified so that an image with the closest size to the
      *            required is returned (e.g. a thumbnail version if available). Note that this
      *            method does no image resizing and the result will most probably not have the
      *            required size.
+     * @param transformationCodeOrNull if transformed images are precomputed, they will be returned
      * @return image (with original file content, page and color)
      */
     AbsoluteImageReference tryGetImage(String channelCode,
-            ImageChannelStackReference channelStackReference, RequestedImageSize imageSize);
+            ImageChannelStackReference channelStackReference, RequestedImageSize imageSize,
+            String transformationCodeOrNull);
 
     /**
      * Finds representative image of this data set. Returns <code>null</code> if no image was found.
@@ -55,9 +57,11 @@ public interface IImagingDatasetLoader extends IImageDatasetLoader
      *            required is returned (e.g. a thumbnail version if available). Note that this
      *            method does no image resizing and the result will most probably not have the
      *            required size.
+     * @param transformationCodeOrNull if transformed images are precomputed, they will be returned
      */
     AbsoluteImageReference tryGetRepresentativeImage(String channelCode,
-            Location wellLocationOrNull, RequestedImageSize imageSize);
+            Location wellLocationOrNull, RequestedImageSize imageSize,
+            String transformationCodeOrNull);
 
     /**
      * Tries to find a representative thumbnail of this data set. Returns <code>null</code> if no
@@ -73,9 +77,11 @@ public interface IImagingDatasetLoader extends IImageDatasetLoader
      * @param wellLocationOrNull if not null the returned images are restricted to one well.
      *            Otherwise the dataset is assumed to have no container and spots.
      * @param imageSize
+     * @param transformationCodeOrNull
      */
     AbsoluteImageReference tryGetRepresentativeThumbnail(String channelCode,
-            Location wellLocationOrNull, RequestedImageSize imageSize);
+            Location wellLocationOrNull, RequestedImageSize imageSize,
+            String transformationCodeOrNull);
 
     /**
      * Returns the stored thumbnail for the given parameters, or <code>null</code>, if no thumbnail
@@ -87,8 +93,10 @@ public interface IImagingDatasetLoader extends IImageDatasetLoader
      * @param channelCode The code of the channel to get the thumbnail for.
      * @param channelStackReference Specifies well and tile of the thumbnail.
      * @param imageSize
+     * @param transformationCodeOrNull if transformed images are precomputed, they will be returned
      */
     AbsoluteImageReference tryGetThumbnail(String channelCode,
-            ImageChannelStackReference channelStackReference, RequestedImageSize imageSize);
+            ImageChannelStackReference channelStackReference, RequestedImageSize imageSize,
+            String transformationCodeOrNull);
 
 }
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/IImagingLoaderStrategy.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/IImagingLoaderStrategy.java
index 40f037498eb797495bfe40c5d21cb5464f541485..7fd9a08ba06211318f4f6d4c954f6059e719f7f8 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/IImagingLoaderStrategy.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/IImagingLoaderStrategy.java
@@ -35,7 +35,8 @@ public interface IImagingLoaderStrategy extends IImageDatasetLoader
      * @return image (with original file content, page and color)
      */
     AbsoluteImageReference tryGetImage(String channelCode,
-            ImageChannelStackReference channelStackReference, RequestedImageSize imageSize);
+            ImageChannelStackReference channelStackReference, RequestedImageSize imageSize,
+            String transformationCodeOrNull);
 
     /**
      * Finds representative image of this dataset in a given channel.
@@ -49,5 +50,6 @@ public interface IImagingLoaderStrategy extends IImageDatasetLoader
      *            required size.
      */
     AbsoluteImageReference tryGetRepresentativeImage(String channelCode,
-            Location wellLocationOrNull, RequestedImageSize imageSize);
+            Location wellLocationOrNull, RequestedImageSize imageSize,
+            String transformationCodeOrNull);
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/ImagingLoaderStrategyFactory.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/ImagingLoaderStrategyFactory.java
index bacc108b641d08fbc653d4bd8c6c1817952efd03..5833749b01cabc84d23827e38af4d5c058e3293c 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/ImagingLoaderStrategyFactory.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/ImagingLoaderStrategyFactory.java
@@ -60,18 +60,19 @@ public class ImagingLoaderStrategyFactory
                 @Override
                 public AbsoluteImageReference tryGetImage(String channelCode,
                         ImageChannelStackReference channelStackReference,
-                        RequestedImageSize imageSize)
+                        RequestedImageSize imageSize, String transformationCodeOrNull)
                 {
                     return this.imageAccessor.tryGetThumbnail(channelCode, channelStackReference,
-                            imageSize);
+                            imageSize, transformationCodeOrNull);
                 }
 
                 @Override
                 public AbsoluteImageReference tryGetRepresentativeImage(String channelCode,
-                        Location wellLocationOrNull, RequestedImageSize imageSize)
+                        Location wellLocationOrNull, RequestedImageSize imageSize,
+                        String transformationCodeOrNull)
                 {
                     return imageAccessor.tryGetRepresentativeThumbnail(channelCode,
-                            wellLocationOrNull, imageSize);
+                            wellLocationOrNull, imageSize, transformationCodeOrNull);
                 }
 
             };
@@ -85,18 +86,19 @@ public class ImagingLoaderStrategyFactory
                 @Override
                 public AbsoluteImageReference tryGetImage(String channelCode,
                         ImageChannelStackReference channelStackReference,
-                        RequestedImageSize imageSize)
+                        RequestedImageSize imageSize, String transformationCodeOrNull)
                 {
                     return this.imageAccessor.tryGetImage(channelCode, channelStackReference,
-                            imageSize);
+                            imageSize, transformationCodeOrNull);
                 }
 
                 @Override
                 public AbsoluteImageReference tryGetRepresentativeImage(String channelCode,
-                        Location wellLocationOrNull, RequestedImageSize imageSize)
+                        Location wellLocationOrNull, RequestedImageSize imageSize,
+                        String transformationCodeOrNull)
                 {
                     return imageAccessor.tryGetRepresentativeImage(channelCode, wellLocationOrNull,
-                            imageSize);
+                            imageSize, transformationCodeOrNull);
                 }
             };
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/PrefixedImage.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/PrefixedImage.java
index 39a46c8becb2d62a37a613b80b755c409bf47c79..d88318df57a9cccc828ad09caa5eaf09263d36e2 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/PrefixedImage.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/PrefixedImage.java
@@ -30,12 +30,16 @@ public class PrefixedImage
 
     private final String pathSuffix;
 
+    private final String singleChannelTransformationCodeOrNull;
+
     private final ImgImageDTO image;
 
-    public PrefixedImage(String pathPrefix, String pathSuffix, ImgImageDTO image)
+    public PrefixedImage(String pathPrefix, String pathSuffix,
+            String singleChannelTransformationCodeOrNull, ImgImageDTO image)
     {
         this.pathPrefix = pathPrefix;
         this.pathSuffix = pathSuffix;
+        this.singleChannelTransformationCodeOrNull = singleChannelTransformationCodeOrNull;
         this.image = image;
     }
 
@@ -64,4 +68,8 @@ public class PrefixedImage
         return image.tryGetImageTransformerFactory();
     }
 
+    public String tryGetSingleChannelTransformationCode()
+    {
+        return singleChannelTransformationCodeOrNull;
+    }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dataaccess/ImagingDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dataaccess/ImagingDatasetLoader.java
index 60662bfa361bce92756287bd3611752e1623950f..693d53934181bd7a2b13cfc0705a39239884aa2c 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dataaccess/ImagingDatasetLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dataaccess/ImagingDatasetLoader.java
@@ -18,8 +18,10 @@ package ch.systemsx.cisd.openbis.dss.etl.dataaccess;
 
 import java.awt.image.BufferedImage;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.commons.lang.StringUtils;
 
@@ -48,6 +50,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgIm
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgImageDatasetDTO;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgImageTransformationDTO;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgImageZoomLevelDTO;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgImageZoomLevelTransformationEnrichedDTO;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgSpotDTO;
 
 /**
@@ -55,6 +58,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgSp
  * 
  * @author Tomasz Pylak
  * @author Piotr Buczek
+ * @author Pawel Glyzewski
  */
 public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDatasetLoader
 {
@@ -91,7 +95,8 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
      */
     @Override
     public AbsoluteImageReference tryGetImage(String chosenChannelCode,
-            ImageChannelStackReference channelStackReference, RequestedImageSize imageSize)
+            ImageChannelStackReference channelStackReference, RequestedImageSize imageSize,
+            String singleChannelTransformationCodeOrNull)
     {
         if (StringUtils.isBlank(chosenChannelCode))
         {
@@ -111,7 +116,8 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
         if (imageSize.isThumbnailRequired())
         {
             imageDTO =
-                    tryGetThumbnail(chosenChannelId, channelStackReference, datasetId, imageSize);
+                    tryGetThumbnail(chosenChannelId, channelStackReference, datasetId, imageSize,
+                            singleChannelTransformationCodeOrNull);
         }
         boolean thumbnailFetched = (imageDTO != null);
         if (imageDTO == null)
@@ -124,7 +130,7 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
             {
                 imageDTO =
                         tryGetThumbnail(chosenChannelId, channelStackReference, datasetId,
-                                imageSize);
+                                imageSize, singleChannelTransformationCodeOrNull);
                 thumbnailFetched = (imageDTO != null);
             }
         }
@@ -170,7 +176,8 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
                 createImageTransfomationFactories(image, channel);
         ImageLibraryInfo imageLibrary = tryGetImageLibrary(dataset, useNativeImageLibrary);
         return new AbsoluteImageReference(contentNode, path, image.getImageID(), colorComponent,
-                imageSize, getColor(channel), imageTransfomationFactories, imageLibrary);
+                imageSize, getColor(channel), imageTransfomationFactories, imageLibrary,
+                image.tryGetSingleChannelTransformationCode());
     }
 
     private static ChannelColorRGB getColor(ImgChannelDTO channel)
@@ -307,7 +314,7 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
                     + channelStackReference;
             image = query.tryGetImage(channelId, channelStackId, datasetId);
         }
-        return checkAccessability("", "", image);
+        return checkAccessability("", "", null, image);
     }
 
     private static ImgImageZoomLevelDTO selectBestZoomLevel(ImgImageZoomLevelDTO current,
@@ -363,13 +370,15 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
 
     private PrefixedImage tryGetThumbnail(long channelId,
             ImageChannelStackReference channelStackReference, long datasetId,
-            RequestedImageSize imageSize)
+            RequestedImageSize imageSize, String singleChannelTransformationCodeOrNullOrNull)
     {
         HCSChannelStackByLocationReference hcsRef = channelStackReference.tryGetHCSChannelStack();
         MicroscopyChannelStackByLocationReference micRef =
                 channelStackReference.tryGetMicroscopyChannelStack();
         ImgImageDTO image;
-        String[] pathPrefixAndSuffix = findPathPrefixAndSuffix(datasetId, imageSize);
+        String[] pathPrefixAndSuffix =
+                findPathPrefixAndSuffix(datasetId, channelId, imageSize,
+                        singleChannelTransformationCodeOrNullOrNull);
 
         if (hcsRef != null)
         {
@@ -386,22 +395,61 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
                     + channelStackReference;
             image = query.tryGetThumbnail(channelId, channelStackId, datasetId);
         }
-        return checkAccessability(pathPrefixAndSuffix[0], pathPrefixAndSuffix[1], image);
+        return checkAccessability(pathPrefixAndSuffix[0], pathPrefixAndSuffix[1],
+                pathPrefixAndSuffix[2], image);
     }
 
-    private String[] findPathPrefixAndSuffix(long datasetId, RequestedImageSize imageSize)
+    private String[] findPathPrefixAndSuffix(long datasetId, long channelId,
+            RequestedImageSize imageSize, String singleChannelTransformationCodeOrNull)
     {
         String[] ret = new String[]
-            { "", "" };
+            { "", "", null };
         ImgImageZoomLevelDTO bestZoomLevel = null;
         List<ImgImageZoomLevelDTO> zoomLevels = query.listImageZoomLevels(datasetId);
         if (zoomLevels != null && zoomLevels.size() > 0)
         {
-            for (ImgImageZoomLevelDTO zoomLevel : zoomLevels)
+            if (singleChannelTransformationCodeOrNull != null)
             {
-                if (false == zoomLevel.getIsOriginal())
+                List<ImgImageZoomLevelTransformationEnrichedDTO> zoomLevelTransformations =
+                        query.findImageZoomLevelTransformations(datasetId, channelId,
+                                singleChannelTransformationCodeOrNull);
+
+                if (false == zoomLevelTransformations.isEmpty())
+                {
+
+                    Set<Long> zoomLevelsWithTransformedImages = new HashSet<Long>();
+                    for (ImgImageZoomLevelTransformationEnrichedDTO zoomLevelTransformation : zoomLevelTransformations)
+                    {
+                        zoomLevelsWithTransformedImages.add(zoomLevelTransformation
+                                .getImageZoomLevelId());
+                    }
+
+                    for (ImgImageZoomLevelDTO zoomLevel : zoomLevels)
+                    {
+                        if (false == zoomLevel.getIsOriginal()
+                                && zoomLevelsWithTransformedImages.contains(zoomLevel.getId()))
+                        {
+                            bestZoomLevel =
+                                    selectBestZoomLevel(bestZoomLevel, zoomLevel, imageSize);
+                        }
+                    }
+                }
+
+                if (bestZoomLevel != null)
                 {
-                    bestZoomLevel = selectBestZoomLevel(bestZoomLevel, zoomLevel, imageSize);
+                    ret[2] = singleChannelTransformationCodeOrNull;
+                }
+            }
+
+            if (bestZoomLevel == null)
+            {
+                zoomLevels = query.listImageZoomLevelsWithNoTransformations(datasetId);
+                for (ImgImageZoomLevelDTO zoomLevel : zoomLevels)
+                {
+                    if (false == zoomLevel.getIsOriginal())
+                    {
+                        bestZoomLevel = selectBestZoomLevel(bestZoomLevel, zoomLevel, imageSize);
+                    }
                 }
             }
 
@@ -426,14 +474,14 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
     }
 
     private PrefixedImage checkAccessability(String pathPrefix, String pathSuffix,
-            ImgImageDTO imageOrNull)
+            String singleChannelTransformationCodeOrNull, ImgImageDTO imageOrNull)
     {
         if (imageOrNull == null)
         {
             return null;
         }
         return isFileAccessible(pathPrefix, pathSuffix, imageOrNull) ? new PrefixedImage(
-                pathPrefix, pathSuffix, imageOrNull) : null;
+                pathPrefix, pathSuffix, singleChannelTransformationCodeOrNull, imageOrNull) : null;
     }
 
     private boolean isFileAccessible(String pathPrefix, String pathSuffix, ImgImageDTO image)
@@ -492,7 +540,7 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
                         query.tryGetHCSRepresentativeImage(datasetId, wellLocationOrNull, channelId);
             }
         }
-        return checkAccessability("", "", image);
+        return checkAccessability("", "", null, image);
     }
 
     @Override
@@ -508,7 +556,8 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
             {
                 AbsoluteImageReference image =
                         tryGetRepresentativeImage(channelCode,
-                                new Location(well.getColumn(), well.getRow()), originalOrThumbnail);
+                                new Location(well.getColumn(), well.getRow()), originalOrThumbnail,
+                                null);
                 if (image != null)
                 {
                     return image;
@@ -520,7 +569,8 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
 
     @Override
     public AbsoluteImageReference tryGetRepresentativeImage(String channelCode,
-            Location wellLocationOrNull, RequestedImageSize imageSize)
+            Location wellLocationOrNull, RequestedImageSize imageSize,
+            String singleChannelTransformationCodeOrNull)
     {
         ImgChannelDTO channel = tryLoadChannel(channelCode);
         if (channel == null)
@@ -539,10 +589,13 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
     }
 
     private PrefixedImage tryGetRepresentativeThumbnailImageDTO(long channelId,
-            Location wellLocationOrNull, RequestedImageSize imageSize)
+            Location wellLocationOrNull, RequestedImageSize imageSize,
+            String singleChannelTransformationCodeOrNull)
     {
         long datasetId = getDataset().getId();
-        String[] pathPrefixAndSuffix = findPathPrefixAndSuffix(datasetId, imageSize);
+        String[] pathPrefixAndSuffix =
+                findPathPrefixAndSuffix(datasetId, channelId, imageSize,
+                        singleChannelTransformationCodeOrNull);
 
         ImgImageDTO image;
         if (wellLocationOrNull == null)
@@ -554,7 +607,8 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
                     query.tryGetHCSRepresentativeThumbnail(dataset.getId(), wellLocationOrNull,
                             channelId);
         }
-        return checkAccessability(pathPrefixAndSuffix[0], pathPrefixAndSuffix[1], image);
+        return checkAccessability(pathPrefixAndSuffix[0], pathPrefixAndSuffix[1],
+                pathPrefixAndSuffix[2], image);
     }
 
     @Override
@@ -568,7 +622,7 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
             {
                 AbsoluteImageReference image =
                         tryGetRepresentativeThumbnail(channelCode, new Location(well.getColumn(),
-                                well.getRow()), null);
+                                well.getRow()), null, null);
                 if (image != null)
                 {
                     return image;
@@ -580,7 +634,8 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
 
     @Override
     public AbsoluteImageReference tryGetRepresentativeThumbnail(String channelCode,
-            Location wellLocationOrNull, RequestedImageSize imageSize)
+            Location wellLocationOrNull, RequestedImageSize imageSize,
+            String singleChannelTransformationCodeOrNull)
     {
         ImgChannelDTO channel = tryLoadChannel(channelCode);
         if (channel == null)
@@ -589,7 +644,7 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
         }
         PrefixedImage imageDTO =
                 tryGetRepresentativeThumbnailImageDTO(channel.getId(), wellLocationOrNull,
-                        imageSize);
+                        imageSize, singleChannelTransformationCodeOrNull);
         if (imageDTO == null)
         {
             return null;
@@ -600,7 +655,8 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
 
     @Override
     public AbsoluteImageReference tryGetThumbnail(String channelCode,
-            ImageChannelStackReference channelStackReference, RequestedImageSize imageSize)
+            ImageChannelStackReference channelStackReference, RequestedImageSize imageSize,
+            String singleChannelTransformationCodeOrNull)
     {
         if (StringUtils.isBlank(channelCode))
         {
@@ -616,7 +672,8 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
 
         long datasetId = getDataset().getId();
         final PrefixedImage thumbnailDTO =
-                tryGetThumbnail(channel.getId(), channelStackReference, datasetId, imageSize);
+                tryGetThumbnail(channel.getId(), channelStackReference, datasetId, imageSize,
+                        singleChannelTransformationCodeOrNull);
         if (thumbnailDTO == null)
         {
             return null;
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/MergingImagesDownloadServlet.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/MergingImagesDownloadServlet.java
index a7e1177fb0e5b615d7b0056cda8a0ab4b88c266d..506391bd1bdbfdead2c6ede63e2346a477bbae9c 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/MergingImagesDownloadServlet.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/MergingImagesDownloadServlet.java
@@ -69,7 +69,7 @@ public class MergingImagesDownloadServlet extends AbstractImagesDownloadServlet
     {
         Size thumbnailSize = tryGetThumbnailSize(resolution);
         return ImageChannelsUtils.getRepresentativeImageStream(datasetRoot, datasetCode, null,
-                thumbnailSize);
+                thumbnailSize, null);
     }
 
     private static Size tryGetThumbnailSize(ImageResolutionKind resolution)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java
index d52e984085ea23c8d066bd1b432d8e73484ba08f..f3b06d50201765ffd0e91e389f85fb65e7d2d599 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java
@@ -81,17 +81,23 @@ public class ImageChannelsUtils
 
     private final RequestedImageSize imageSizeLimit;
 
+    private final String singleChannelTransformationCodeOrNull;
+
     @Private
-    ImageChannelsUtils(IImagingLoaderStrategy imageLoaderStrategy, RequestedImageSize imageSizeLimit)
+    ImageChannelsUtils(IImagingLoaderStrategy imageLoaderStrategy,
+            RequestedImageSize imageSizeLimit, String singleChannelTransformationCodeOrNull)
     {
         this.imageLoaderStrategy = imageLoaderStrategy;
         this.imageSizeLimit = imageSizeLimit;
+        this.singleChannelTransformationCodeOrNull = singleChannelTransformationCodeOrNull;
     }
 
     @Private
-    ImageChannelsUtils(IImagingLoaderStrategy imageLoaderStrategy, Size imageSizeLimitOrNull)
+    ImageChannelsUtils(IImagingLoaderStrategy imageLoaderStrategy, Size imageSizeLimitOrNull,
+            String singleChannelTransformationCodeOrNull)
     {
-        this(imageLoaderStrategy, new RequestedImageSize(imageSizeLimitOrNull, false));
+        this(imageLoaderStrategy, new RequestedImageSize(imageSizeLimitOrNull, false),
+                singleChannelTransformationCodeOrNull);
     }
 
     /**
@@ -123,7 +129,8 @@ public class ImageChannelsUtils
             // NOTE: never merges the overlays, draws each channel separately (merging looses
             // transparency and is slower)
             List<ImageWithReference> overlayImages =
-                    getSingleImagesSkipNonExisting(overlayChannels, overlaySize, contentProvider);
+                    getSingleImagesSkipNonExisting(overlayChannels, overlaySize,
+                            params.tryGetSingleChannelTransformationCode(), contentProvider);
             for (ImageWithReference overlayImage : overlayImages)
             {
                 if (image != null)
@@ -144,10 +151,12 @@ public class ImageChannelsUtils
 
     private static List<ImageWithReference> getSingleImagesSkipNonExisting(
             DatasetAcquiredImagesReference imagesReference, RequestedImageSize imageSize,
+            String singleChannelTransformationCodeOrNull,
             IHierarchicalContentProvider contentProvider)
     {
         ImageChannelsUtils utils =
-                createImageChannelsUtils(imagesReference, contentProvider, imageSize);
+                createImageChannelsUtils(imagesReference, contentProvider, imageSize,
+                        singleChannelTransformationCodeOrNull);
         boolean mergeAllChannels = utils.isMergeAllChannels(imagesReference);
         List<AbsoluteImageReference> imageContents =
                 utils.fetchImageContents(imagesReference, mergeAllChannels, true);
@@ -197,7 +206,8 @@ public class ImageChannelsUtils
             IHierarchicalContentProvider contentProvider, RequestedImageSize imageSizeLimit)
     {
         ImageChannelsUtils imageChannelsUtils =
-                createImageChannelsUtils(imageChannels, contentProvider, imageSizeLimit);
+                createImageChannelsUtils(imageChannels, contentProvider, imageSizeLimit,
+                        singleChannelTransformationCodeOrNull);
         boolean useMergedChannelsTransformation =
                 imageChannelsUtils.isMergeAllChannels(imageChannels);
         ImageTransformationParams transformationInfo =
@@ -209,12 +219,13 @@ public class ImageChannelsUtils
 
     private static ImageChannelsUtils createImageChannelsUtils(
             DatasetAcquiredImagesReference imageChannels,
-            IHierarchicalContentProvider contentProvider, RequestedImageSize imageSizeLimit)
+            IHierarchicalContentProvider contentProvider, RequestedImageSize imageSizeLimit,
+            String singleChannelTransformationCodeOrNull)
     {
         IImagingDatasetLoader imageAccessor = createImageAccessor(imageChannels, contentProvider);
         return new ImageChannelsUtils(
                 ImagingLoaderStrategyFactory.createImageLoaderStrategy(imageAccessor),
-                imageSizeLimit);
+                imageSizeLimit, singleChannelTransformationCodeOrNull);
     }
 
     @Private
@@ -249,7 +260,7 @@ public class ImageChannelsUtils
                     imagesReference.getChannelStackReference();
             AbsoluteImageReference image =
                     imageLoaderStrategy.tryGetImage(channelCode, channelStackReference,
-                            imageSizeLimit);
+                            imageSizeLimit, singleChannelTransformationCodeOrNull);
             if (image == null && skipNonExisting == false)
             {
                 throw createImageNotFoundException(channelStackReference, channelCode);
@@ -288,13 +299,14 @@ public class ImageChannelsUtils
      */
     public static ResponseContentStream getRepresentativeImageStream(
             IHierarchicalContent dataSetRoot, String datasetCode, Location wellLocationOrNull,
-            Size imageSizeLimitOrNull)
+            Size imageSizeLimitOrNull, String singleChannelTransformationCodeOrNull)
     {
         IImagingDatasetLoader imageAccessor = createDatasetLoader(dataSetRoot, datasetCode);
         List<AbsoluteImageReference> imageReferences =
                 new ImageChannelsUtils(
                         ImagingLoaderStrategyFactory.createImageLoaderStrategy(imageAccessor),
-                        imageSizeLimitOrNull).getRepresentativeImageReferences(wellLocationOrNull);
+                        imageSizeLimitOrNull, singleChannelTransformationCodeOrNull)
+                        .getRepresentativeImageReferences(wellLocationOrNull);
         BufferedImage image =
                 calculateBufferedImage(imageReferences, new ImageTransformationParams(true, true,
                         null));
@@ -354,7 +366,8 @@ public class ImageChannelsUtils
                                 : chosenChannelCode);
 
         ImageChannelsUtils imageChannelsUtils =
-                new ImageChannelsUtils(imageLoaderStrategy, imageSizeLimitOrNull);
+                new ImageChannelsUtils(imageLoaderStrategy, imageSizeLimitOrNull,
+                        singleChannelImageTransformationCodeOrNull);
         boolean mergeAllChannels = imageChannelsUtils.isMergeAllChannels(imagesReference);
         List<AbsoluteImageReference> imageContents =
                 imageChannelsUtils.fetchImageContents(imagesReference, mergeAllChannels, false);
@@ -429,7 +442,7 @@ public class ImageChannelsUtils
     {
         AbsoluteImageReference image =
                 imageLoaderStrategy.tryGetRepresentativeImage(channelCode, wellLocationOrNull,
-                        imageSizeLimit);
+                        imageSizeLimit, singleChannelTransformationCodeOrNull);
         if (image != null)
         {
             return image;
@@ -553,11 +566,13 @@ public class ImageChannelsUtils
         {
             return resultImage;
         }
-        IImageTransformerFactory channelLevelTransformationOrNull;
+        IImageTransformerFactory channelLevelTransformationOrNull = null;
         if (transformationInfo.isUseMergedChannelsTransformation())
         {
             channelLevelTransformationOrNull = transfomations.tryGetForMerged();
-        } else
+        } else if (transformationInfo.tryGetSingleChannelTransformationCode() != null
+                && (false == transformationInfo.tryGetSingleChannelTransformationCode().equals(
+                        imageReference.tryGetSingleChannelTransformationCode())))
         {
             channelLevelTransformationOrNull =
                     transfomations.tryGetForChannel(transformationInfo
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java
index 27e32e49eea12512a2b3bfdad451ed297fe492ce..47c456e23cb3017de9e772207c5b85545063f6af 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java
@@ -414,11 +414,13 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
             IImageDatasetIdentifier dataset)
     {
         ImageDatasetParameters params = imageAccessor.getImageParameters();
+
         RequestedImageSize originalOrThumbnail = RequestedImageSize.createOriginal();
         for (String channelCode : params.getChannelsCodes())
         {
             AbsoluteImageReference image =
-                    imageAccessor.tryGetRepresentativeImage(channelCode, null, originalOrThumbnail);
+                    imageAccessor.tryGetRepresentativeImage(channelCode, null, originalOrThumbnail,
+                            null);
             if (image != null)
             {
                 return image.getUnchangedImage();
@@ -434,7 +436,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
         for (String channelCode : params.getChannelsCodes())
         {
             AbsoluteImageReference image =
-                    imageAccessor.tryGetRepresentativeThumbnail(channelCode, null, null);
+                    imageAccessor.tryGetRepresentativeThumbnail(channelCode, null, null, null);
             if (image != null)
             {
                 return image.getUnchangedImage();
@@ -584,9 +586,11 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
     {
         return loadImages(sessionToken, imageReferences, null, null, convertToPng);
     }
-    
+
     @Override
-    public List<String> loadImagesBase64(String sessionToken, List<PlateImageReference> imageReferences, boolean convertToPng) {
+    public List<String> loadImagesBase64(String sessionToken,
+            List<PlateImageReference> imageReferences, boolean convertToPng)
+    {
 
         InputStream stream = loadImages(sessionToken, imageReferences, convertToPng);
 
@@ -596,8 +600,10 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
         List<String> result = new ArrayList<String>();
         try
         {
-            for (byte[] bytes = extractNextImage(imagesWriter); bytes.length > 0; bytes = extractNextImage(imagesWriter)) {
-               result.add(Base64.encodeBytes(bytes));
+            for (byte[] bytes = extractNextImage(imagesWriter); bytes.length > 0; bytes =
+                    extractNextImage(imagesWriter))
+            {
+                result.add(Base64.encodeBytes(bytes));
             }
         } catch (IOException ex)
         {
@@ -606,14 +612,13 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
         return result;
     }
 
-    
-    private byte[] extractNextImage(ConcatenatedFileOutputStreamWriter imagesWriter) throws IOException
+    private byte[] extractNextImage(ConcatenatedFileOutputStreamWriter imagesWriter)
+            throws IOException
     {
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         imagesWriter.writeNextBlock(outputStream);
         return outputStream.toByteArray();
     }
-    
 
     @Override
     public InputStream loadImages(String sessionToken, List<PlateImageReference> imageReferences,
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/HCSImageResolutionLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/HCSImageResolutionLoader.java
index f3bde24dbd8e085f53785773b422bb6c5a3ce333..ecbece555df538306342d7cf78adcb20c27f1bed 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/HCSImageResolutionLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/HCSImageResolutionLoader.java
@@ -66,7 +66,8 @@ public class HCSImageResolutionLoader implements IImageResolutionLoader
     @Override
     public List<ImageResolution> getImageResolutions()
     {
-        List<ImgImageZoomLevelDTO> zoomLevels = query.listImageZoomLevels(dataset.getId());
+        List<ImgImageZoomLevelDTO> zoomLevels =
+                query.listImageZoomLevelsWithNoTransformations(dataset.getId());
 
         if (zoomLevels == null || zoomLevels.isEmpty())
         {
@@ -85,5 +86,4 @@ public class HCSImageResolutionLoader implements IImageResolutionLoader
             return resolutions;
         }
     }
-
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/dataaccess/IImagingReadonlyQueryDAO.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/dataaccess/IImagingReadonlyQueryDAO.java
index 6d7a44b70920d5440245f2fa72410a1e55d48cb4..f6eec6d11ca3783ecb1aa3fe045e66c4d62f89a6 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/dataaccess/IImagingReadonlyQueryDAO.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/dataaccess/IImagingReadonlyQueryDAO.java
@@ -248,10 +248,19 @@ public interface IImagingReadonlyQueryDAO extends BaseQuery
     @Select(sql = "select * from IMAGE_ZOOM_LEVELS zoom where zoom.CONTAINER_DATASET_ID = ?{1}", fetchSize = FETCH_SIZE)
     public List<ImgImageZoomLevelDTO> listImageZoomLevels(long datasetId);
 
+    @Select(sql = "select * from IMAGE_ZOOM_LEVELS zoom where zoom.CONTAINER_DATASET_ID = ?{1} "
+            + "and ID not in (select ZOOM_LEVEL_ID from IMAGE_ZOOM_LEVEL_TRANSFORMATIONS)", fetchSize = FETCH_SIZE)
+    public List<ImgImageZoomLevelDTO> listImageZoomLevelsWithNoTransformations(long datasetId);
+
     @Select(sql = SQL_ZOOM_LEVEL_TRANSFORMATIONS_ENRICHED + " and zl.container_dataset_id = ?{1}", fetchSize = FETCH_SIZE)
     public List<ImgImageZoomLevelTransformationEnrichedDTO> listImageZoomLevelTransformations(
             long datasetId);
 
+    @Select(sql = SQL_ZOOM_LEVEL_TRANSFORMATIONS_ENRICHED
+            + " and zl.container_dataset_id = ?{1} and izlt.channel_id = ?{2} and it.code = ?{3}", fetchSize = FETCH_SIZE)
+    public List<ImgImageZoomLevelTransformationEnrichedDTO> findImageZoomLevelTransformations(
+            long datasetId, long channelId, String transformationCode);
+
     @Select(sql = "select * from IMAGE_ZOOM_LEVELS zoom where zoom.physical_dataset_perm_id = ?{1} and zoom.is_original")
     public List<ImgImageZoomLevelDTO> listOriginalImageZoomLevelsByPermId(String datasetPermId);
 
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/etl/ImageSizeFeedingMaintenanceTaskTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/etl/ImageSizeFeedingMaintenanceTaskTest.java
index ee580e11d5050e3fb829820110689e141d6b1a70..17f415dcc4247b49dc5ef257616c3ea3f92b2123 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/etl/ImageSizeFeedingMaintenanceTaskTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/etl/ImageSizeFeedingMaintenanceTaskTest.java
@@ -42,23 +42,22 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgIm
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgImageZoomLevelDTO;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 public class ImageSizeFeedingMaintenanceTaskTest extends AssertJUnit
 {
     private static final long CONTAINER_ID = 42L;
-    
+
     private static final class MockAbsoluteImageReference extends AbsoluteImageReference
     {
         private final int width;
+
         private final int height;
 
         public MockAbsoluteImageReference(int width, int height)
         {
             super(null, null, null, null, new RequestedImageSize(null, false), null,
-                    new ImageTransfomationFactories(), null);
+                    new ImageTransfomationFactories(), null, null);
             this.width = width;
             this.height = height;
         }
@@ -73,18 +72,29 @@ public class ImageSizeFeedingMaintenanceTaskTest extends AssertJUnit
             return new Size(width, height);
         }
     }
-    
+
     private BufferedAppender logRecorder;
+
     private Mockery context;
+
     private IImagingQueryDAO dao;
+
     private IEncapsulatedOpenBISService service;
+
     private IHierarchicalContentProvider contentProvider;
+
     private ImageSizeFeedingMaintenanceTask maintenanceTask;
+
     private IHierarchicalContent ds1Content;
+
     private IHierarchicalContent ds2Content;
+
     private IHierarchicalContent ds3Content;
+
     private IImagingDatasetLoader imageLoader1;
+
     private IImagingDatasetLoader imageLoader2;
+
     private IImagingDatasetLoader imageLoader3;
 
     @BeforeMethod
@@ -101,7 +111,8 @@ public class ImageSizeFeedingMaintenanceTaskTest extends AssertJUnit
         imageLoader1 = context.mock(IImagingDatasetLoader.class, "ds1-loader");
         imageLoader2 = context.mock(IImagingDatasetLoader.class, "ds2-loader");
         imageLoader3 = context.mock(IImagingDatasetLoader.class, "ds3-loader");
-        final Map<String, IImagingDatasetLoader> loaderMap = new HashMap<String, IImagingDatasetLoader>();
+        final Map<String, IImagingDatasetLoader> loaderMap =
+                new HashMap<String, IImagingDatasetLoader>();
         loaderMap.put("ds1", imageLoader1);
         loaderMap.put("ds2", imageLoader2);
         loaderMap.put("ds3", imageLoader3);
@@ -121,14 +132,14 @@ public class ImageSizeFeedingMaintenanceTaskTest extends AssertJUnit
             };
         assertEquals(true, maintenanceTask.requiresDataStoreLock());
     }
-    
+
     @AfterMethod
     public void tearDown()
     {
         logRecorder.reset();
         context.assertIsSatisfied();
     }
-    
+
     @Test
     public void testNonMatchingOrUnknownDataSets()
     {
@@ -139,25 +150,25 @@ public class ImageSizeFeedingMaintenanceTaskTest extends AssertJUnit
                 {
                     one(service).listDataSets();
                     will(returnValue(Arrays.asList(ds0, ds1)));
-                    
+
                     one(contentProvider).asContent(ds1.getDataSetCode());
                     will(returnValue(ds1Content));
-                    
+
                     one(dao).tryGetImageDatasetByPermId(ds1.getDataSetCode());
                     will(returnValue(null));
-                    
+
                     one(ds1Content).close();
                 }
             });
-        
+
         maintenanceTask.execute();
-        
+
         assertEquals("Scan 2 data sets.\n"
                 + "0 original image sizes and 0 thumbnail image sizes are added to the database.",
                 logRecorder.getLogContent());
         context.assertIsSatisfied();
     }
-    
+
     @Test
     public void testImageDataSets()
     {
@@ -173,7 +184,8 @@ public class ImageSizeFeedingMaintenanceTaskTest extends AssertJUnit
                     will(returnValue(Arrays.asList(ds1, ds2, ds3)));
                 }
             });
-        prepareListZoomLevels(ds1, ds1Content, new ImgImageZoomLevelDTO("", true, "", 1, 2, null, null, 12));
+        prepareListZoomLevels(ds1, ds1Content, new ImgImageZoomLevelDTO("", true, "", 1, 2, null,
+                null, 12));
         prepareListZoomLevels(ds2, ds2Content);
         prepareForTryFindAnyOriginal(ds2, imageLoader2, new MockAbsoluteImageReference(144, 89));
         prepareForAddZoomLevel(zoomLevelRecorder);
@@ -186,20 +198,21 @@ public class ImageSizeFeedingMaintenanceTaskTest extends AssertJUnit
         prepareForCommit();
 
         maintenanceTask.execute();
-        
+
         List<ImgImageZoomLevelDTO> zoomLevels = zoomLevelRecorder.getRecordedObjects();
         assertEquals("Scan 3 data sets.\n" + "Original size 144x89 added for data set ds2\n"
                 + "Thumbnail size 21x34 added for data set ds3\n"
                 + "1 original image sizes and 1 thumbnail image sizes are added to the database.",
                 logRecorder.getLogContent());
-        assertEquals("[ImgImageZoomLevelDTO{physicalDatasetPermId=ds2,isOriginal=true,"
-                + "containerDatasetId=99715,rootPath=,width=144,height=89,colorDepth=<null>,fileType=<null>,id=0}, "
-                + "ImgImageZoomLevelDTO{physicalDatasetPermId=ds3,isOriginal=false,"
-                + "containerDatasetId=99716,rootPath=,width=21,height=34,colorDepth=<null>,fileType=<null>,id=0}]",
+        assertEquals(
+                "[ImgImageZoomLevelDTO{physicalDatasetPermId=ds2,isOriginal=true,"
+                        + "containerDatasetId=99715,rootPath=,width=144,height=89,colorDepth=<null>,fileType=<null>,id=0}, "
+                        + "ImgImageZoomLevelDTO{physicalDatasetPermId=ds3,isOriginal=false,"
+                        + "containerDatasetId=99716,rootPath=,width=21,height=34,colorDepth=<null>,fileType=<null>,id=0}]",
                 zoomLevels.toString());
         context.assertIsSatisfied();
     }
-    
+
     @Test
     public void testExceptionHandling()
     {
@@ -222,22 +235,22 @@ public class ImageSizeFeedingMaintenanceTaskTest extends AssertJUnit
         prepareForAddZoomLevel(zoomLevelRecorder);
         prepareForTryFindAnyThumbnail(ds2, imageLoader2, new MockAbsoluteImageReference(-13, 0));
         prepareForRollback();
-        
+
         maintenanceTask.execute();
-        
+
         List<ImgImageZoomLevelDTO> zoomLevels = zoomLevelRecorder.getRecordedObjects();
-        assertEquals("Scan 2 data sets.\n" + 
-        		"2 exceptions occured:\n" + 
-        		"Data set ds1: java.lang.RuntimeException: Negative width: -1\n" + 
-        		"Data set ds2: java.lang.RuntimeException: Negative width: -13\n" + 
-        		"0 original image sizes and 0 thumbnail image sizes are added to the database.",
+        assertEquals("Scan 2 data sets.\n" + "2 exceptions occured:\n"
+                + "Data set ds1: java.lang.RuntimeException: Negative width: -1\n"
+                + "Data set ds2: java.lang.RuntimeException: Negative width: -13\n"
+                + "0 original image sizes and 0 thumbnail image sizes are added to the database.",
                 logRecorder.getLogContent());
-        assertEquals("[ImgImageZoomLevelDTO{physicalDatasetPermId=ds2,isOriginal=true,"
-                + "containerDatasetId=99715,rootPath=,width=1,height=2,colorDepth=<null>,fileType=<null>,id=0}]",
+        assertEquals(
+                "[ImgImageZoomLevelDTO{physicalDatasetPermId=ds2,isOriginal=true,"
+                        + "containerDatasetId=99715,rootPath=,width=1,height=2,colorDepth=<null>,fileType=<null>,id=0}]",
                 zoomLevels.toString());
         context.assertIsSatisfied();
     }
-    
+
     private void prepareListZoomLevels(final SimpleDataSetInformationDTO dataSet,
             final IHierarchicalContent content, final ImgImageZoomLevelDTO... zoomLevels)
     {
@@ -256,8 +269,7 @@ public class ImageSizeFeedingMaintenanceTaskTest extends AssertJUnit
                     will(returnValue(imageDataSet));
 
                     one(dao).listImageZoomLevels(imageDataSet.getId());
-                    will(returnValue(Arrays
-                            .asList(zoomLevels)));
+                    will(returnValue(Arrays.asList(zoomLevels)));
 
                     one(content).close();
                 }
@@ -276,7 +288,6 @@ public class ImageSizeFeedingMaintenanceTaskTest extends AssertJUnit
             });
     }
 
-
     private void prepareForTryFindAnyThumbnail(final SimpleDataSetInformationDTO dataSet,
             final IImagingDatasetLoader loader, final AbsoluteImageReference thumbnailOrNull)
     {
@@ -288,7 +299,7 @@ public class ImageSizeFeedingMaintenanceTaskTest extends AssertJUnit
                 }
             });
     }
-    
+
     private void prepareForAddZoomLevel(
             final RecordingMatcher<ImgImageZoomLevelDTO> zoomLevelRecorder)
     {
@@ -309,17 +320,17 @@ public class ImageSizeFeedingMaintenanceTaskTest extends AssertJUnit
                 }
             });
     }
-    
+
     private void prepareForRollback()
     {
         context.checking(new Expectations()
-        {
             {
-                one(dao).rollback();
-            }
-        });
+                {
+                    one(dao).rollback();
+                }
+            });
     }
-    
+
     private SimpleDataSetInformationDTO dataSet(String code, String type)
     {
         SimpleDataSetInformationDTO dataSet = new SimpleDataSetInformationDTO();
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtilsTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtilsTest.java
index 7549757e7620a59ace41bf36ed5b4ae602d17d70..5c5eac15af02071fb4094e41af7380cbfe66efb3 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtilsTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtilsTest.java
@@ -53,8 +53,8 @@ import ch.systemsx.cisd.openbis.dss.generic.server.images.dto.ImageTransformatio
 import ch.systemsx.cisd.openbis.dss.generic.server.images.dto.RequestedImageSize;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.Size;
 import ch.systemsx.cisd.openbis.dss.generic.shared.utils.ImageUtilTest;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.InternalImageChannel;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ImageDatasetParameters;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.InternalImageChannel;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.InternalImageTransformationInfo;
 
 /**
@@ -180,8 +180,8 @@ public class ImageChannelsUtilsTest extends AssertJUnit
                 {
                     allowing(loader).getImageParameters();
                     ImageDatasetParameters imgParams = new ImageDatasetParameters();
-                    imgParams.setInternalChannels(Arrays.asList(new InternalImageChannel(CHANNEL, CHANNEL, null,
-                            null, new ArrayList<InternalImageTransformationInfo>())));
+                    imgParams.setInternalChannels(Arrays.asList(new InternalImageChannel(CHANNEL,
+                            CHANNEL, null, null, new ArrayList<InternalImageTransformationInfo>())));
                     will(returnValue(imgParams));
 
                     RequestedImageSize requestedSize =
@@ -189,7 +189,7 @@ public class ImageChannelsUtilsTest extends AssertJUnit
                                     .createOriginal() : absoluteImageReferenceOrNull
                                     .getRequestedSize();
                     one(loader).tryGetImage(imageRef.getChannelCodes(null).get(0),
-                            imageRef.getChannelStackReference(), requestedSize);
+                            imageRef.getChannelStackReference(), requestedSize, null);
                     will(returnValue(absoluteImageReferenceOrNull));
                 }
             });
@@ -247,14 +247,14 @@ public class ImageChannelsUtilsTest extends AssertJUnit
             RequestedImageSize imageSize)
     {
         return new AbsoluteImageReference(image(fileName), "id42", null, null, imageSize,
-                new ChannelColorRGB(0, 0, 255), new ImageTransfomationFactories(), null);
+                new ChannelColorRGB(0, 0, 255), new ImageTransfomationFactories(), null, null);
     }
 
     private ImageChannelsUtils createImageChannelsUtils(Size thumbnailSizeOrNull)
     {
         return new ImageChannelsUtils(
                 ImagingLoaderStrategyFactory.createImageLoaderStrategy(loader),
-                new RequestedImageSize(thumbnailSizeOrNull, false));
+                new RequestedImageSize(thumbnailSizeOrNull, false), null);
     }
 
     public void assertPNG(IHierarchicalContentNode image)
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java
index 071f8b119872e9dc52e356bc62d96bb33310bff4..23ef9d1d9a69ae595751a12a79e3e4bc1dd1d28d 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java
@@ -279,8 +279,8 @@ public class DssServiceRpcScreeningTest extends AssertJUnit
             { 1, 2 };
         String[][] featureCodesPerDataset = new String[][]
             {
-                    { "f1", "f2" },
-                    { "f2", "f3" } };
+                { "f1", "f2" },
+                { "f2", "f3" } };
         prepareListAnalysisDatasets(dataSetIDs);
         prepareGetFeatureDefinitions(dataSetIDs, featureCodesPerDataset);
 
@@ -304,16 +304,16 @@ public class DssServiceRpcScreeningTest extends AssertJUnit
         FeatureInformation[][] featureCodesPerDataset =
                 new FeatureInformation[][]
                     {
-                            {
-                                    new FeatureInformation("f1", "Feature 1",
-                                            "The first feature."),
-                                    new FeatureInformation("f2", "Feature 2",
-                                            "The second feature.") },
-                            {
-                                    new FeatureInformation("f2", "Feature 2",
-                                            "The second feature."),
-                                    new FeatureInformation("f3", "Feature 3",
-                                            "The third feature.") } };
+                                {
+                                        new FeatureInformation("f1", "Feature 1",
+                                                "The first feature."),
+                                        new FeatureInformation("f2", "Feature 2",
+                                                "The second feature.") },
+                                {
+                                        new FeatureInformation("f2", "Feature 2",
+                                                "The second feature."),
+                                        new FeatureInformation("f3", "Feature 3",
+                                                "The third feature.") } };
         prepareListAnalysisDatasets(dataSetIDs);
         prepareGetFeatureDefinitions(dataSetIDs, featureCodesPerDataset);
 
@@ -339,12 +339,12 @@ public class DssServiceRpcScreeningTest extends AssertJUnit
         FeatureVectorDatasetReference r2 = createFeatureVectorDatasetReference(DATASET_CODE2);
         String[][] featureCodesPerDataset = new String[][]
             {
-                    { "F1", "F2" } };
+                { "F1", "F2" } };
         prepareLoadFeatures(new long[]
             { 1 }, featureCodesPerDataset);
         featureCodesPerDataset = new String[][]
             {
-                    { "F2" } };
+                { "F2" } };
         prepareLoadFeatures(new long[]
             { 2 }, featureCodesPerDataset);
 
@@ -393,17 +393,17 @@ public class DssServiceRpcScreeningTest extends AssertJUnit
                     one(imageLoader).tryGetImage(
                             channel,
                             ImageChannelStackReference.createHCSFromLocations(new Location(3, 1),
-                                    new Location(1, 1)), thumbnailSize);
+                                    new Location(1, 1)), thumbnailSize, null);
                     will(returnValue(new AbsoluteImageReference(image("img1.jpg"), "img1", null,
                             null, thumbnailSize, createBlueColor(),
-                            new ImageTransfomationFactories(), null)));
+                            new ImageTransfomationFactories(), null, null)));
                     one(imageLoader).tryGetImage(
                             channel,
                             ImageChannelStackReference.createHCSFromLocations(new Location(3, 1),
-                                    new Location(2, 1)), thumbnailSize);
+                                    new Location(2, 1)), thumbnailSize, null);
                     will(returnValue(new AbsoluteImageReference(image("img1.gif"), "img1", null,
                             null, thumbnailSize, createBlueColor(),
-                            new ImageTransfomationFactories(), null)));
+                            new ImageTransfomationFactories(), null, null)));
                 }
             });
 
@@ -538,18 +538,18 @@ public class DssServiceRpcScreeningTest extends AssertJUnit
                     one(imageLoader).tryGetImage(
                             CHANNEL_CODE,
                             ImageChannelStackReference.createHCSFromLocations(new Location(1, 1),
-                                    new Location(1, 1)), thumbnailSize);
+                                    new Location(1, 1)), thumbnailSize, null);
                     will(returnValue(new AbsoluteImageReference(image("img1.jpg"), "img1", null,
                             null, thumbnailSize, createBlueColor(),
-                            new ImageTransfomationFactories(), null)));
+                            new ImageTransfomationFactories(), null, null)));
 
                     one(imageLoader).tryGetImage(
                             CHANNEL_CODE,
                             ImageChannelStackReference.createHCSFromLocations(new Location(2, 1),
-                                    new Location(2, 1)), thumbnailSize);
+                                    new Location(2, 1)), thumbnailSize, null);
                     will(returnValue(new AbsoluteImageReference(image("img1.png"), "img1", null,
                             null, thumbnailSize, createBlueColor(),
-                            new ImageTransfomationFactories(), null)));
+                            new ImageTransfomationFactories(), null, null)));
 
                 }
             });
@@ -826,8 +826,8 @@ public class DssServiceRpcScreeningTest extends AssertJUnit
                                     new PlateFeatureValues(NativeTaggedArray
                                             .toByteArray(new MDFloatArray(new float[][]
                                                 {
-                                                        { 3.5f * dataSetId + offset },
-                                                        { 1.25f * dataSetId + offset } })));
+                                                    { 3.5f * dataSetId + offset },
+                                                    { 1.25f * dataSetId + offset } })));
                             ImgFeatureValuesDTO value =
                                     new ImgFeatureValuesDTO(0.0, 0.0, matrixValues, 0L);
                             value.setFeatureDefId(featureDefIds[featureDefIx]);