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 3757838a304d8f80807927236532116dd4fd1fdf..52c02e208ce337460fff81445ecc7ca5e571dd1a 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
@@ -55,6 +55,17 @@ public interface IImagingDatasetLoader extends IImageDatasetLoader
     AbsoluteImageReference tryGetRepresentativeImage(String channelCode,
             Location wellLocationOrNull, RequestedImageSize imageSize);
 
+    /**
+     * Tries to find a representative thumbnail of this dataset in a given channel. Returns NULL if
+     * no thumbnail was found.
+     * 
+     * @param channelCode channel code for which representative image is requested
+     * @param wellLocationOrNull if not null the returned images are restricted to one well.
+     *            Otherwise the dataset is assumed to have no container and spots.
+     */
+    AbsoluteImageReference tryGetRepresentativeThumbnail(String channelCode,
+            Location wellLocationOrNull);
+
     /**
      * Returns the stored thumbnail for the given parameters, or <code>null</code>, if no thumbnail
      * has been stored.
@@ -63,7 +74,7 @@ public interface IImagingDatasetLoader extends IImageDatasetLoader
      * It will just plain give you the byte array that has been stored for the thumbnail.
      * 
      * @param channelCode The code of the channel to get the thumbnail for.
-     * @param channelStackReference Specifies well and tile of the thumbnail. 
+     * @param channelStackReference Specifies well and tile of the thumbnail.
      */
     IContent tryGetThumbnail(String channelCode, ImageChannelStackReference channelStackReference);
 
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 61d3b65910563964a2495f1708b271c342c1113b..336c98e63c3ca2babdd623d99b8ac7c3d037b729 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
@@ -295,6 +295,37 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
         return createAbsoluteImageReference(imageDTO, channel, imageSize, useNativeImageLibrary);
     }
 
+    private ImgImageDTO tryGetRepresentativeThumbnailImageDTO(long channelId,
+            Location wellLocationOrNull)
+    {
+        if (wellLocationOrNull == null)
+        {
+            return query.tryGetMicroscopyRepresentativeThumbnail(dataset.getId(), channelId);
+        } else
+        {
+            return query.tryGetHCSRepresentativeThumbnail(dataset.getId(), wellLocationOrNull,
+                    channelId);
+        }
+    }
+
+    public AbsoluteImageReference tryGetRepresentativeThumbnail(String channelCode,
+            Location wellLocationOrNull)
+    {
+        ImgChannelDTO channel = tryLoadChannel(channelCode);
+        if (channel == null)
+        {
+            return null;
+        }
+        ImgImageDTO imageDTO =
+                tryGetRepresentativeThumbnailImageDTO(channel.getId(), wellLocationOrNull);
+        if (imageDTO == null)
+        {
+            return null;
+        }
+        return createAbsoluteImageReference(imageDTO, channel, new RequestedImageSize(
+                Size.NULL_SIZE, false), false);
+    }
+
     public IContent tryGetThumbnail(String channelCode,
             ImageChannelStackReference channelStackReference)
     {
@@ -338,4 +369,5 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa
             return null;
         }
     }
+
 }
\ No newline at end of file
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 1bba06c2d246fa2802f8558c319f23826842490b..2ccee7a932e492e658d5f06fe922005026593e02 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
@@ -104,10 +104,6 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
      */
     public static final int MINOR_VERSION = 8;
 
-    /**
-     * NULL_SIZE encodes for "no thumbnails available"
-     */
-    private final static Size NULL_SIZE = new Size(0, 0);
 
     static
     {
@@ -221,8 +217,8 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
     {
         final IImagingDatasetLoader imageAccessor =
                 createImageLoader(dataset.getDatasetCode(), datasetRoot);
-        final Size imageSize = getImageSize(dataset, imageAccessor, false);
-        final Size thumbnailSize = getImageSize(dataset, imageAccessor, true);
+        final Size imageSize = getOriginalImageSize(dataset, imageAccessor);
+        final Size thumbnailSize = getThumbnailImageSize(dataset, imageAccessor);
         final ImageDatasetParameters params = imageAccessor.getImageParameters();
         return new ImageDatasetMetadata(dataset, params.getChannelsCodes(),
                 params.getChannelsLabels(), params.getTileRowsNum(), params.getTileColsNum(),
@@ -230,31 +226,56 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
                 thumbnailSize.getHeight());
     }
 
-    private static Size getImageSize(IImageDatasetIdentifier dataset,
-            IImagingDatasetLoader imageAccessor, boolean thumbnailsRequired)
+    private static Size getOriginalImageSize(IImageDatasetIdentifier dataset,
+            IImagingDatasetLoader imageAccessor)
     {
-        BufferedImage image = getAnyImage(imageAccessor, dataset, thumbnailsRequired);
+        BufferedImage image = getAnyImage(imageAccessor, dataset);
         Size imageSize = new Size(image.getWidth(), image.getHeight());
         return imageSize;
     }
 
+    private static Size getThumbnailImageSize(IImageDatasetIdentifier dataset,
+            IImagingDatasetLoader imageAccessor)
+    {
+        BufferedImage image = getAnyThumbnailImage(imageAccessor, dataset);
+        if (image != null)
+        {
+            return new Size(image.getWidth(), image.getHeight());
+        } else
+        {
+            return Size.NULL_SIZE;
+        }
+    }
+
     private static BufferedImage getAnyImage(IImagingDatasetLoader imageAccessor,
-            IImageDatasetIdentifier dataset, boolean thumbnailsRequired)
+            IImageDatasetIdentifier dataset)
     {
         if (imageAccessor.getImageParameters().tryGetRowsNum() == null)
         {
-            return getAnyMicroscopyImage(imageAccessor, dataset, thumbnailsRequired);
+            return getAnyMicroscopyImage(imageAccessor, dataset);
         } else
         {
-            return getAnyHCSImage(imageAccessor, dataset, thumbnailsRequired);
+            return getAnyHCSImage(imageAccessor, dataset);
+        }
+    }
+
+    private static BufferedImage getAnyThumbnailImage(IImagingDatasetLoader imageAccessor,
+            IImageDatasetIdentifier dataset)
+    {
+        if (imageAccessor.getImageParameters().tryGetRowsNum() == null)
+        {
+            return getAnyMicroscopyThumbnail(imageAccessor, dataset);
+        } else
+        {
+            return getAnyHCSThumbnail(imageAccessor, dataset);
         }
     }
 
     private static BufferedImage getAnyMicroscopyImage(IImagingDatasetLoader imageAccessor,
-            IImageDatasetIdentifier dataset, boolean thumbnailsRequired)
+            IImageDatasetIdentifier dataset)
     {
         ImageDatasetParameters params = imageAccessor.getImageParameters();
-        RequestedImageSize originalOrThumbnail = createOriginalOrThumbnail(thumbnailsRequired);
+        RequestedImageSize originalOrThumbnail = RequestedImageSize.createOriginal();
         for (String channelCode : params.getChannelsCodes())
         {
             AbsoluteImageReference image =
@@ -267,19 +288,50 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
         throw new IllegalStateException("Cannot find any image in a dataset: " + dataset);
     }
 
-    private static RequestedImageSize createOriginalOrThumbnail(boolean thumbnailsRequired)
+    private static BufferedImage getAnyMicroscopyThumbnail(IImagingDatasetLoader imageAccessor,
+            IImageDatasetIdentifier dataset)
+    {
+        ImageDatasetParameters params = imageAccessor.getImageParameters();
+        for (String channelCode : params.getChannelsCodes())
+        {
+            AbsoluteImageReference image =
+                    imageAccessor.tryGetRepresentativeThumbnail(channelCode, null);
+            if (image != null)
+            {
+                return image.getImage();
+            }
+        }
+        return null;
+    }
+
+    private static BufferedImage getAnyHCSThumbnail(IImagingDatasetLoader imageAccessor,
+            IImageDatasetIdentifier dataset)
     {
-        // exact thumbnail size does not matter, we just want to mark that we do not want the
-        // original image
-        return thumbnailsRequired ? new RequestedImageSize(NULL_SIZE, false) : RequestedImageSize
-                .createOriginal();
+        ImageDatasetParameters params = imageAccessor.getImageParameters();
+        for (int row = 1; row <= params.tryGetRowsNum(); row++)
+        {
+            for (int col = 1; col <= params.tryGetColsNum(); col++)
+            {
+                for (String channelCode : params.getChannelsCodes())
+                {
+                    AbsoluteImageReference image =
+                            imageAccessor.tryGetRepresentativeThumbnail(channelCode, new Location(
+                                    col, row));
+                    if (image != null)
+                    {
+                        return image.getImage();
+                    }
+                }
+            }
+        }
+        return null;
     }
 
     private static BufferedImage getAnyHCSImage(IImagingDatasetLoader imageAccessor,
-            IImageDatasetIdentifier dataset, boolean thumbnailsRequired)
+            IImageDatasetIdentifier dataset)
     {
         ImageDatasetParameters params = imageAccessor.getImageParameters();
-        RequestedImageSize originalOrThumbnail = createOriginalOrThumbnail(thumbnailsRequired);
+        RequestedImageSize originalOrThumbnail = RequestedImageSize.createOriginal();
         for (int row = 1; row <= params.tryGetRowsNum(); row++)
         {
             for (int col = 1; col <= params.tryGetColsNum(); col++)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetMetadata.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetMetadata.java
index 9b18f60695b436774b5c9d94b47389776eb08729..c659c22e0aa7264e3ca529507ebbab9c7dba3ba7 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetMetadata.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetMetadata.java
@@ -176,12 +176,7 @@ public class ImageDatasetMetadata implements Serializable
      */
     public boolean hasThumbnails()
     {
-        return isInRange(thumbnailHeight, 0, height) && isInRange(thumbnailWidth, 0, width);
-    }
-
-    private boolean isInRange(int value, int lowerBound, int upperBound)
-    {
-        return lowerBound < value && value < upperBound;
+        return thumbnailHeight > 0 && thumbnailWidth > 0;
     }
 
     @Override
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java
index b14cd12f54399f79b30b7b6f20e179954b75e9a9..d9f049aaadc135e4d9b8d3afff2e59483372a6e9 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java
@@ -921,8 +921,8 @@ public class ScreeningOpenbisServiceFacadeTest extends AbstractFileSystemTestCas
 
                     ImageDatasetMetadata imgMetaData =
                             new ImageDatasetMetadata(imageDataSetId, Collections
-                                    .<String> emptyList(),
-                                    Collections.<String> emptyList(), 3, 3, 1024, 768, 1024, 768);
+                                    .<String> emptyList(), Collections.<String> emptyList(), 3, 3,
+                                    1024, 768, 0, 0);
 
                     will(returnValue(Arrays.asList(imgMetaData)));
                 }