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 1adc6e9a4c3a8e4b8a896f983c9f749efc977c13..27c9c41fe7f00eb35d7af58ff2a3105993c24ec0 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
@@ -16,9 +16,12 @@
 
 package ch.systemsx.cisd.openbis.dss.etl;
 
+import java.awt.image.BufferedImage;
+
 import ch.systemsx.cisd.common.io.IContent;
 import ch.systemsx.cisd.openbis.dss.etl.dto.ImageTransfomationFactories;
 import ch.systemsx.cisd.openbis.dss.generic.server.images.dto.RequestedImageSize;
+import ch.systemsx.cisd.openbis.dss.generic.shared.utils.ImageUtil;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ColorComponent;
 
 /**
@@ -30,13 +33,15 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.Color
 public class AbsoluteImageReference extends AbstractImageReference
 {
     private final IContent content;
-
+    
     private final String uniqueId;
 
     private final RequestedImageSize imageSize;
 
     private final ImageTransfomationFactories imageTransfomationFactories;
 
+    private BufferedImage image;
+    
     // This is an artificial value which helps to keep coloring channels constant. Starts with 0.
     // Unique for a given experiment or dataset (if channels are per dataset).
     private int channelIndex;
@@ -72,6 +77,15 @@ public class AbsoluteImageReference extends AbstractImageReference
     {
         return content;
     }
+    
+    public BufferedImage getImage()
+    {
+        if (image == null)
+        {
+            image = ImageUtil.loadImage(content, tryGetPage());
+        }
+        return image;
+    }
 
     public RequestedImageSize getRequestedSize()
     {
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 c24810d9657f77db13f96cc407a0fd450dbf4f55..bb85b38b5352661d152ee9ad6649f6b8d875604a 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
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.openbis.dss.etl.dataaccess;
 
+import java.awt.image.BufferedImage;
+
 import org.apache.commons.lang.StringUtils;
 
 import ch.systemsx.cisd.base.image.IImageTransformerFactory;
@@ -30,6 +32,7 @@ import ch.systemsx.cisd.openbis.dss.generic.server.images.dto.ImageChannelStackR
 import ch.systemsx.cisd.openbis.dss.generic.server.images.dto.ImageChannelStackReference.HCSChannelStackByLocationReference;
 import ch.systemsx.cisd.openbis.dss.generic.server.images.dto.ImageChannelStackReference.MicroscopyChannelStackByLocationReference;
 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.plugin.screening.shared.imaging.HCSDatasetLoader;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ColorComponent;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.IImagingReadonlyQueryDAO;
@@ -82,6 +85,21 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
             return null;
         }
         AbsoluteImageReference imgRef = createAbsoluteImageReference(imageDTO, channel, imageSize);
+        if (thumbnailPrefered)
+        {
+            Size requestedThumbnailSize = imageSize.tryGetThumbnailSize();
+            BufferedImage image = imgRef.getImage();
+            double width = 1.5 * image.getWidth();
+            double height = 1.5 * image.getHeight();
+            if (requestedThumbnailSize.getWidth() > width || requestedThumbnailSize.getHeight() > height)
+            {
+                imageDTO = tryGetImageDTO(channelStackReference, false, channel.getId(), datasetId);
+                if (imageDTO != null)
+                {
+                    imgRef = createAbsoluteImageReference(imageDTO, channel, imageSize);
+                }
+            }
+        }
 
         return imgRef;
     }
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 54268f601a0f8872d7cf39a45e82be92fd950218..45536f929b755301703ccafaac8e86b606ed5e03 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
@@ -430,7 +430,7 @@ public class ImageChannelsUtils
     private static BufferedImage calculateSingleImage(AbsoluteImageReference imageReference)
     {
         long start = operationLog.isDebugEnabled() ? System.currentTimeMillis() : 0;
-        BufferedImage image = loadImage(imageReference);
+        BufferedImage image = imageReference.getImage();
         if (operationLog.isDebugEnabled())
         {
             operationLog.debug("Load original image: " + (System.currentTimeMillis() - start));
@@ -468,11 +468,6 @@ public class ImageChannelsUtils
         return image;
     }
 
-    private static BufferedImage loadImage(AbsoluteImageReference imageReference)
-    {
-        return ImageUtil.loadImage(imageReference.getContent(), imageReference.tryGetPage());
-    }
-
     /**
      * @param allChannelsMerged if true then we use one special transformation on the merged images
      *            instead of transforming every single image.